好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

大数相加PHP 大数相加取模

很多站长朋友们都不太清楚大数相加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的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于大数相加PHP 大数相加取模的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did207549
更新时间:2023-05-03   阅读:19次

上一篇: logstashphp的简单介绍

下一篇:php手册入门教程 phpipam手册

最新资料更新

  • 1.包含苏州软世通php的词条
  • 2.phpword读写 php读写word 文档
  • 3.免费的php解密 php des解密
  • 4.php在线运行测试 php 测试工具
  • 5.php图片打不开 php打不开文件
  • 6.php数据抓取实例 php采集数据
  • 7.PHP数组多值排序 php数组按值排序
  • 8.phpnodelay的简单介绍
  • 9.修改文件限制php php修改上传文件大小
  • 10.链式作用域php php 链式调用
  • 11.郑州php业余培训 郑州php业余培训机构
  • 12.phpwhere循环 php中的循环
  • 13.php环境配置工具 phpstorm2021配置php环境
  • 14.php带协议跳转 php跳转函数
  • 15.无限级菜单php java无限极菜单
  • 16.php空间景安 php 免费空间
  • 17.php代码调用js php调用java代码
  • 18.phpword导出 phpspreadsheet导出
  • 19.php查询数组找到 php查找数组元素
  • 20.php操作redis存值 php redis数据类型

CopyRight:2016-{hedonghua:year}{hedonghua:sitegs} 备案ICP:湘ICP备09009000号-16 {hedonghua:sitejym}
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]