先讲一种错误的做法:WA了n次,大神一定帮我看一下//看到有说数组大小开到250,我改了之后还是不//思路是将arr这个数组的每一行附上输入的值,然后求每列所有数之和,当然进位

//maxlen记录这个二维数组的有用就是可以加的长度列数,row用来记录行数,那就不用遍历二维数组所有行列
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char tempArr[250];
int arr[250][250],fin[250],i,row=0,maxlen=0,column;
/*下面这个while循环用来把每次输入的字符串先放在tempArr里,然后转换,放到arr里面*/
while(scanf("%s",tempArr)!=EOF)
{
int len;
len=strlen(tempArr);
column=249;
if(tempArr[0]=='0' &&len==1)
break;
for(i=len-1;i>=0;i--)
{
arr[row][column]=tempArr[i]-'0';//arr每一行最后几列用来存数字
column--;
}
row++;//row记录行数
if(maxlen<len)
{
maxlen=len;//记录输入的数中那个数的长度最长
}
}
/*下面就是大数加法的算法实现*/
int temp=0,index=249;
for(column=249;column>(247-maxlen);column--)//从最后一列开始加
{//估计最多进两位,所以循环出去的条件我就随便写了,下面有跳过前导0的
int columnSum=0;
for(i=0;i<row;i++)
{
columnSum+=arr[i][column];
}
fin[index]=(columnSum+temp)%10;//对这个数组的赋值也是从fin最后开始的
temp=(columnSum+temp)/10;
index--;
}
//得到第一个不为0的fin下标,从左至右
while(fin[index]==0){
index++;
     if(index=250)
      break;
  }
  if(index==250)
    printf("%d",0);
  else{
//从哪个位置开始输出
for(i=index;i<=249;i++)
{
printf("%d",fin[i]);
}
printf("\n");
  }
return 0;
}

  大致思路:复用tempArr,第一个while循环用来分别给arr的各行赋值,以row来记录二维数组实际行数

分别从最后几列开始赋值,一直赋到tempArr中没有元素,i=0,第二个块用来给每一列求和,纠结一点的:

for(column=249;column>(247-maxlen);column--)//从最后一列开始加
{//估计最多进两位,所以循环出去的条件我就随便写了,下面有跳过前导0的
int columnSum=0;
for(i=0;i<row;i++)
{
columnSum+=arr[i][column];
}
fin[index]=(columnSum+temp)%10;//对这个数组的赋值也是从fin最后开始的
temp=(columnSum+temp)/10;
index--;
}

  原想求得row,求得len,不用遍历整个数组

比如:246    247   248    249      len=4,249-maxlen:249-4=245,两个for循环,第一个for用来循环列,比如1+9999,当列固定在246列时,循环弹出来了,fin[246]得0,temp=1,如果用column>249-maxlen=245,1就没得到进位,类似:

 while(temp>0)
{
int c;
c=temp+fin[j];
temp=c/10;
fin[j]=c%10;
j++;
}

我没用这个方法,我把遍历范围放的尽量大,但是最多进两位,所以247-maxlen应该是合理的了,还是不行,我开到遍历完每一列,也不行,求解?

第二种方法:

始终保持一个fin数组用来放结果,每次的输入放在input中,memset下fin为0,将input数组从右往左,分别加到fin的第一个,第二个..元素,搜获到的技巧:

for(i=len-,j=;i>=;i--,j++)

for循环上写两个变量的初值及变化,增加可读性

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char input[];
int fin[]={};
int len,temp,i,j;
while(scanf("%s",input)!=EOF)
{
if(input[]=='' && strlen(input)==)
break;
len=strlen(input);
temp=;
for(i=len-,j=;i>=;i--,j++)//循环跳出条件input数组取到第一个元素
{
int c;
c=input[i]-''+fin[j]+temp;
temp=c/;
fin[j]=c%;
}
     //循环结束后,j++此时为finde下一个待决定位
  //处理字符串读完,但是仍有进位的情况
while(temp>)
{
int c;
c=temp+fin[j];
temp=c/;
fin[j]=c%;
j++;
}
}
i=;
    //倒序输出,去掉前导0,fin里面可能全是0,i此时为-1,输出0
while(fin[i]==)//000+00
{
i--;
        //网上没有if这个步奏,但我觉得会溢出之类的
if(i==-)
break;
}
if(i<)
printf("%d\n",);
else
{
for(;i>=;i--)
{
printf("%d",fin[i]);
}
printf("\n");
}
return ;
}

总结:这题坑在000+00,999+1

收获:int 数组,将第一个以int a[5]={1},可将第一个元素赋为0,其余元素为0

char就不行,应该是编译器决定的,所以gcc最好memset,但是以上都仅限scanf

如果用赋值,最好memset

第三种:看不懂

http://www.slyar.com/blog/poj-1503-c.html

poj1503---大数加法的更多相关文章

  1. 【大数加法】POJ-1503、NYOJ-103

    1503:Integer Inquiry 总时间限制:  1000ms 内存限制:  65536kB 描述 One of the first users of BIT's new supercompu ...

  2. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  3. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...

  4. 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)

    题目连接:http://www.ifrog.cc/acm/problem/1056 DESCRIPTION Two octal number integers a, b are given, and ...

  5. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  6. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  7. java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  8. vector、string实现大数加法乘法

    理解 vector 是一个容器,是一个数据集,里边装了很多个元素.与数组最大的不同是 vector 可以动态增长. 用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将 ...

  9. A + B Problem II 大数加法

    题目描述: Input The first line of the input contains an integer T(1<=T<=20) which means the number ...

  10. NI笔试——大数加法

    NI笔试: 1.找出字符串第一次出现的字符.用数组建立哈希表,然后再扫描字符串并判断次数是否为1. 2.大数加法,即字符串加法.因为之前写过乘法,就以为是乘法.然后就把乘法写上去了····= = 好了 ...

随机推荐

  1. Listview注意事项

    1.缓存 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder ho ...

  2. mysql 分区 按 PARTITION BY RANGE (TO_DAYS(startTime))

    to_days() Given a date date, returns a day number (the number of days since year 0). 给定一个date 日期,返回天 ...

  3. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  4. linux系统监控常用工具

    linux系统监控常用工具 一.系统核心工具包(coreutils) 1./bin/df 报告系统的磁盘空间用量 df -h  显示磁盘分区fdisk -l 2./bin/uname 显示系统信息 u ...

  5. C语言的本质(30)——C语言与汇编之ELF文件格式

    ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Obj ...

  6. C语言的本质(20)——预处理之二:条件预处理和包含头文件

    我们可以通过定义不同的宏来决定编译程序对哪些代码进行处理.条件编译指令将决定那些代码被编译,而哪些是不被编译的.可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件. 条件编译可分为三种情况,按 ...

  7. 反对抄袭 正解spring的@Autowired 不要相信网上的错误版本

    首先,最重要的, @Autowired的就是用来来消除 set ,get方法. 有些介绍,如著名的马士兵,说要在set方法上进行注入.我当时就看不明白了,既然只取消了一个GET,这个@Autowire ...

  8. 九度OJ 题目1371:最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 输入: 每个测试案例包括2行: 第一行为2个整数n,k(1< ...

  9. 关于OF和CF

    很久很久前写的.越来越意识到作为一名科班出身的学生的重要性. 自己在使用IDA时,发现F5产生类似的这种代码. 其中有一句,v5 <= -141920797,我在想为什么是负数.如果把-1419 ...

  10. EditText默认不显示光标,不可编辑,点击它,进入编辑状态,光标显示

    设置EditText不可编辑,光标不可见: et.setCursorVisible(false); 设置EditText可编辑,光标可见: et.setOnClickListener(new OnCl ...