98 加法器
问题描述 :
明明读小学的时候,不喜欢数学,尤其是不喜欢做加法,一做加法就头疼,这样导致明明长大后数学依然不好,而且对数字产生了抵触心理。可是不巧的是,明明进了一家会计公司,每天都要计算很多数据,在这些计算中加法运算居多,而且这些加法不只是是两个数之间的加法,更有多个数的连加。 例如:1+2+3的正确答案是6。 这给明明造成了很大的麻烦。你是明明的好朋友,看到明明如此痛苦,就产生了帮助明明的想法。你想帮明明写一个程序,这个程序能计算一串正整数的连加,从而帮助明明摆脱数字的困扰。 明明的问题可以归结为:给你一串正整数的连加表达式,完成这个表达式的计算。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅有一行,每行有一个表达式,表达式由正整数和加号(“+”)组成,不含其他任何符号,表达式中的数字小于等于30000,表达式的长度不超过1000,具体格式见输入样例。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即表达式的值。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
1+2+3
5+111
输出范例 :
6
116
思想:按位保存数据,注意处理高位的数字,我们进行计数,当遇到+时,把前面的各位数据进行还原,比如5+111,初始start=0,遍历到5,count++,到+时,还原 5*count=5,清空计数器,置start指向下一位i+1,当遍历到111最后一位时,我们count=3,依次还原,sum+=s[i+j]* pow10(--count)。即可求出解。
#include <stdio.h> #include <string.h> int Mypow(int num){ //计算10的num次方 int i; int res=1; for(i=0;i<num;i++){ res *=10; } return res; } int main() { char s[1000]={'+'}; int i,j,k; while(gets(s)!=NULL){ int sum = 0; int count = 0; int start = 0; for(i=0;i<=strlen(s)+1;i++){ if(s[i]>=48&&s[i]<=57){ //48 是1的asc码 57是9的asc码 count++; }else{ int w = count; //保存count的值,这里的count如果记3位,我们实际应该是乘10的2次方,变成三位数,即--w开始 for(j=0;j<count;j++){ sum += (s[start+j]-48) * Mypow(--w); //注意将asc码还原成数字 -48 } count = 0; start = i+1;//从下一位开始 } } printf("%d\n",sum); } }