很多站长朋友们都不太清楚大数相加PHP,今天小编就来给大家整理大数相加PHP,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 一道php问题 2、 大数相加(提示:输入的时候可以用scanf("%1d",&a)来控制只读一个字符) 3、 oj上简单的大数相加~为什么我的不对 4、 hdoj1002大数求和 5、 请问比较好的php大数运算库有哪些? 6、 ACM初级题大数加法,本人写的代码如下,自己输入计算没查出错误,但是OJ报WA,求大神解释 一道php问题你可能会点PHP吧,既然是考题,那我说一下假如我做这个题的思路,仅供借鉴。另外最近工作繁忙,不想全给你写好,希望你自己写的过程中获得经验,遇到问题欢迎继续讨论。
产生随机数的方法很简单,产生100位的随机数,可以连续产生100个一位的随机数来组合。
100位数的输出也不困难,就是一些简单循环语句的练习。
核心问题还是100位以内的大数相加,在普通高级语言里面一般都是用串来存储这样的大数,而PHP语言我建议使用数组来存放,因为PHP的数组是动态的,那么事实上我们写的程序可以完成成千上万位的运算,没有100的限制。
我们用数组表示大数,没个数组元素存放一个位,数组的下标为序号,比如数123456789,表示为
$a=array(1,2,3,4,5,6,7,8,9);
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
)
实现这样的两个数组相加,实际上就是两个数组对应元素的相加,下面的示例$a与$b表示的大型整数相加:
$c=0;//进位
for ($i=0;$i<=max(count($a),count($b));$i++){
//循环次数是:数组$a,$b元素最多的个数组,还要+1处理进位
$sum[$i]=($a[$i] + $b[$i] + $c) % 10;//结果只要一位
$c=floor(($a[$i] + $b[$i] + $c) / 10);//计算进位
}
大数相加(提示:输入的时候可以用scanf("%1d",&a)来控制只读一个字符)#include <stdio.h>
#include <string.h>
void add( char* a, char* b, char* c )
{
int i = 0;
int j = 0;
int flag = 0;
int len_a, len_b, len_c;
len_a = strlen( a );
len_b = strlen( b );
if ( len_a > len_b )
{
len_c = len_a + 1;
for ( i = 0; i < len_a; i++ )
c[i+1] = a[i];
i = len_b - 1;
j = len_c - 1;
while ( b[i] )
{
c[j] = c[j] + b[i] - '0';
j--;
i--;
if ( i == -1 ) break;
}
}
else
{
len_c = len_b + 1;
for ( i = 0; i < len_b; i++ )
c[i+1] = b[i];
i = len_a - 1;
j = len_c - 1;
while ( a[i] )
{
c[j] = c[j] + a[i] - '0';
j--;
i--;
if ( i == -1 ) break;
}
}
i = len_c - 1;
while( i >= 0 )
{
if ( c[i] == 0 )
{
if ( flag )
c[i] = '1';
break;
}
if ( flag ) {
c[i]++; flag = 0;
}
if ( c[i] > '9' ) {
flag = 1;
c[i] -= 10;
}
i--;
}
if ( c[0] == 0 )
{
for ( i = 0; i < len_c - 1; i++ )
c[i] = c[i+1];
c[len_c-1] = 0;
}
}
int main()
{
char a[100];
char b[100];
char c[101];
memset( a, 0, 100 );
memset( b, 0, 100 );
memset( c, 0, 101 );
printf( "输入两个大数,空格隔开:\n" );
scanf( "%s %s", a, b );
add( a, b, c );
printf( "%s + %s = %s\n", a, b, c );
return 0;
}
没有按你说的存储123中c[0]=1 c[1]=2 c[2]=3容易处理些。
oj上简单的大数相加~为什么我的不对这是我初学高精度时候写的,AC了
#include<stdio.h>
#include<string.h>
int main()
{
int a[1001]={0},b[1001]={0},c[1001]={0},n;
int i,ka,kb,k,j=0;
char a1[1002],b1[1002];
scanf("%d",n);
while(n--)
{
j++;
scanf("%s %s",a1,b1);
memset(a,0,1001*sizeof(int));
memset(b,0,1001*sizeof(int));
memset(c,0,1001*sizeof(int));
ka=strlen(a1);
kb=strlen(b1);
if(ka>=kb)
k=ka;
else
k=kb;
for(i=0;i<ka;i++)
a[i]=a1[ka-i-1]-'0';
for(i=0;i<kb;i++)
b[i]=b1[kb-i-1]-'0';
for(i=0;i<k;i++)
{
c[i]=a[i]+b[i]+c[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[k])
k++;
printf("Case %d:\n",j);
for(i=0;i<ka;i++)
printf("%c",a1[i]);
printf(" + ");
for(i=0;i<kb;i++)
printf("%c",b1[i]);
printf(" = ");
for(k--;k>=0;k--)
printf("%d",c[k]);
printf("\n");
if(n)
printf("\n");
}
return 0;
}
写高精度一定要头脑清晰,错误比较多,我改了一部分还是没过。。。下面是改后的:
#include "stdio.h"
#include<string.h>
void main()
{
int t,n=0,alen,blen,clen=0,c[1002]={0},i;
char a[1002],b[1002];
scanf("%d",t);
while(t--)
{
for(i=0;i<1002;i++)
c[i]=0;
clen=0;
scanf("%s %s",a,b);
alen=strlen(a);
blen=strlen(b);
while(alen>0||blen>0)
{
if(alen>0blen>0)
{ c[clen]+=a[alen-1]-'0'+b[blen-1]-'0';
if(c[clen]>9)
{
c[clen]-=10;
c[clen+1]++;
}
clen++;
alen--;
blen--;
}
else if(alen>0)
for(i=alen;i>0;i--)
{c[clen]+=a[i-1]-'0';
if(c[clen]>9)
{
c[clen]-=10;
c[clen+1]++;
}
clen++;
}
else if(blen>0)
for(i=blen;i>0;i--)
{c[clen]+=b[i-1]-'0';
if(c[clen]>9)
{
c[clen]-=10;
c[clen+1]++;
}
clen++;
}
}
if(c[clen])
clen++;
printf("Case %d:\n",++n);
printf("%s + %s = ",a,b);
for(i=clen-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
if(t)
printf("\n");
}
}
楼主能找到反例就好改了,我找了会儿没找到,建议楼主初学高精度时把程序模块化,分布做分步调试,错误可能会少些
hdoj1002大数求和问题1
题目要求 读入一个数字n 然后执行n次加法 所以输入n的这个没必要循环 只读取一次就可以
问题2
根据a b长度 设定了maxlen和minlen 但是在计算的第一个for循环中,并没有判断哪个更长 而是直接把a当做了较长一个
a[i] i的循环对应maxlen
b[j] j的循环对应minlen
在第二个循环中有对应的判断
简洁起见 在你的基础上定义了两个指针 char *min, *max; 并用来对应较长和较短的输入字符串
问题3
从判断和最后的输出上看 sum实际上并没有当做字符型来操作 而是直接当做整型操作
所以在计算的时候 需要sum[i]+=max[i]+min[j]-'0'-'0'; 比原始的多减一个'0'
实际上是把a b 对应位上的字符转换为整型再计算
问题4
输出的时候 sum的长度可能为maxlen或者maxlen+1(多的进位保存在flag中) 所以实际sum中存的就是maxlen位
于是输出循环应该是
for(i=0;i<maxlen;i++)
基本上就是这些了 修改后代码如下
格式没检查 不知道会不会有PE 但应该不会WA了
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,len1,len2,maxlen,minlen;
char a[1010],b[1010],sum[1010];
char *max, *min;
scanf("%d",n);
for(m=1;m<=n;m++)
{
int i,j,flag=0;
memset(sum,0,sizeof(sum));
scanf("%s %s",a,b);
len1=strlen(a);
len2=strlen(b);
if(len1>=len2){maxlen=len1;minlen=len2;max = a; min = b;}
else {maxlen=len2;minlen=len1;max = b; min = a;}
for(i=maxlen-1,j=minlen-1;i>=maxlen-minlenj>=0;i--,j--)
{
sum[i]+=max[i]+min[j]-'0'-'0';
if(i==0sum[0]>9){flag=1;sum[0]-=10;}
else if(sum[i]>9){sum[i-1]+=1;sum[i]-=10;}
}
for(i=maxlen-minlen-1;i>=0;i--)
{
sum[i]+=max[i]-'0';
if(i==0sum[0]>9){flag=1;sum[i]-=10;}
else if(sum[i]>9){sum[i-1]++;sum[i]-=10;}
}
printf(" %d\n",flag);
if(flag){printf("Case %d:\n",m);printf("%s + %s = 1",a,b);}
else {printf("Case %d:\n",m);printf("%s + %s = ",a,b);}
for(i=0;i<maxlen;i++)
printf("%d",sum[i]);
printf("\n\n");
}
return 0;
}
请问比较好的php大数运算库有哪些?啥意思?你是要算大的数字还是找数据库?数据库就MYSQL最简单。大数字计算没必要。PHP对于超过精度的数字都是用科学计数法表示的。如echo 1234567891234567890000000000000;输出
1.23456789123E+30。想要精确的结果的话得自己写算法。
ACM初级题大数加法,本人写的代码如下,自己输入计算没查出错误,但是OJ报WA,求大神解释注意对前缀0的处理,给你加了几行代码后ac了
str3[j]='\0';
替换为
j--;
while(j>=0 str3[j]=='0')j--;
if(j<0)j++;
str3[++j]='\0';
------------------------
#include <stdio.h>#include <string.h>#define SIZE 1100voidAdd(char*str1,char*str2,char*str3){
int i, j, i1, i2, tmp, carry;
int len1 = strlen(str1), len2 = strlen(str2);
char ch;
i1 = len1-1; i2 = len2-1;
j = carry =0;
for(; i1 >=0 i2 >=0;++j,--i1,--i2 ){
tmp = str1[i1]-'0'+str2[i2]-'0'+carry;
carry = tmp/10;
str3[j]= tmp%10+'0';
}
while( i1 >=0){
tmp = str1[i1--]-'0'+carry;
carry = tmp/10;
str3[j++]= tmp%10+'0';
}
while( i2 >=0){
tmp = str2[i2--]-'0'+carry;
carry = tmp/10;
str3[j++]= tmp%10+'0';
}
if( carry ) str3[j++]= carry+'0';
j--;
while(j>=0 str3[j]=='0')j--;
if(j<0)j++;
str3[++j]='\0';
for( i=0,--j; i < j;++i,--j ){
ch = str3[i]; str3[i]= str3[j]; str3[j]= ch;
}}int main(){
char str1[SIZE],str2[SIZE],str3[SIZE];
while(scanf("%s%s",str1,str2)!=EOF){
Add(str1,str2,str3);
printf("%s\n",str3);
}
return0;}
关于大数相加PHP的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。