user-0 提问: 溢出怎么解决？

回复:
user: user-1
content: 太阴险了 ------------  可以利用一下整数的二进制表示，数一下每个bit的上1的个数，哈哈！

user: user-2
content: 引用 楼主 zhang5476499 的回复:题目描述：  求1+2+3+...+n，要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。  输入：  输入可能包含多个测试样例。 对于每个测试案例，输入为一个整数n(1<= n<=100000)。  输出：  对应每个测试案例， 输出1+2+3+…+n的值。 代码如下：int sum(int n); #include <stdio.h> #include <time.h>  int main() { 	unsigned long n; 	scanf("%d",&n); 	printf( "%d\n",sum(n) );  	return 0; }  int sum(int n) { 	if(n==1) 		return 1; 	else 		return n+sum(n-1); } 输入n小于等于1万的时候，输出正确，输入大数的时候，数据溢出，一般数据溢出怎么处理？ 也就是说，输入的是10万（题目要求的最大值），怎么解决？  没事别用递归，像这种大数的计算用连续内存来存放运算结果。 栈太长不是每个cpu的sp指针都能飞那么远

user: user-3
content: long long也好，大数 也行，主要看你数据范围

user: user-4
content: 溢出就用动态开辟的方式做，栈的大小貌似只有1MB

user: user-5
content: #include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }

user: user-6
content: 如果来个N=10W， 这栈区估计也得爆吧。。。 10W 次压栈啊，哥！！！

user: user-7
content: 还没结帖 用嵌入汇编实现 假设汇编也不能用除法乘法，就用移位做除法乘法。

user: user-8
content: 都是牛人！！！

user: user-9
content: 1.long类型溢出，这个直接找个大数运算库。 2.犹豫递归引起的堆栈溢出。修改编译器选项，增大堆栈大小。 3.确定数据规模之前，如果不是大神最好别用递归咯。

user: user-10
content: #include<stdio.h> unsigned long long sum; size_t i=1; unsigned long long flag=0xffffffffff;//10  void  fun(const unsigned long  long *p) {         int n=i*((*p+1)>>(i-1)&1)-1;// -1 ro  i-1         sum+=*p<<n;         i++; } int main() {         unsigned long long num=0;         printf("Please  enter  an  integer:");         scanf("%lld",&num);         size_t i=0;         for(;i<20;i++)         {                 fun(&num);         }         printf("sum=%lld\n",sum>>1);         printf("%lld\n",num*(num+1)>>1);         return 0; }

user: user-10
content: 我表示我自杀去了

user: user-10
content: 少用内存的方法    个人感觉在递归过程中   递归函数尽量少使用局部变量   本人对内存比较抠门

user: user-0
content: 引用 4 楼 PDD123 的回复:1.要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。  你可以使用等差数列求和公式。  2.关于溢出，你可以使用 “unsigned __int64”，64位的整型。若还溢出，那么，就只能自己定义一个类型了。  你可以自己搜索一下"大数"等差数列求和，题目要求不可以用除。。。。。。。。。。。

user: user-0
content: 引用 5 楼 sholber 的回复:— long long int类型的最小值：LLONG_MIN   -9223372036854775807 // −(2^63−1) — long long int类型的最大值：LLONG_MAX    +9223372036854775807 // 2^63−1 — unsigned long long int类型的最大值：ULLONG_MAX    18446744073709551615 // 2^64−1 足敷使用了。唯一的问题是楼主比较守旧，抱着过时的编译器不放。在这种情况下，让他苦恼去吧。  PS：不让用if else，楼主居然还用了if else，朕深鄙之。不是说，学的是语言，而不是编译器么？这关编译器什么事？什么才是主流的编译器？

user: user-5
content: //按如下格式打印杨辉三角形的前MAXN行。 //  1 //  1 1 //  1 2 1 //  1 3 3 1 //  1 4 6 4 1 //  1 5 10 10 5 1 #include <stdio.h> #define MAXN 68 unsigned __int64 y[MAXN][MAXN]; int i,j; void main() {     printf("1\n");     printf("1 1\n");     y[1][0]=1ui64;y[1][1]=1ui64;     for (i=2;i<MAXN;i++) {         y[i][0]=1ui64;printf("1 ");         for (j=1;j<=i-1;j++) {             y[i][j]=y[i-1][j-1]+y[i-1][j];             printf("%I64u ",y[i][j]);         }         y[i][i]=1ui64;printf("1\n");     } } //1 //1 1 //1 2 1 //1 3 3 1 //1 4 6 4 1 //1 5 10 10 5 1 //1 6 15 20 15 6 1 //1 7 21 35 35 21 7 1 //1 8 28 56 70 56 28 8 1 //1 9 36 84 126 126 84 36 9 1 //... //1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1

user: user-5
content: 没人提unsigned __int64?

user: user-11
content: 不使用for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。 楼主开发出这种一样新语言了吗？  实在不懂这样的“算法”题有何意义

user: user-12
content: 求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句（A?B:C）。  真正不用这些, 我想看看怎么写出来. 我能想到的是: 1. goto 语句 (循环时使用) 2. 内嵌汇编(判断循环结束) 3. 一条一条写

user: user-13
content: 引用 6 楼 zlm0913 的回复:搜了一下，没想到有这么多解决方法！ http://www.cppblog.com/zengwei0771/archive/2012/04/28/173014.html http://blog.csdn.net/yuucyf/article/details/6400601  都是牛人

user: user-14
content: 引用 19 楼 zhang5476499 的回复:[quote=引用 5 楼 sholber 的回复:] — long long int类型的最小值：LLONG_MIN   -9223372036854775807 // −(2^63−1) — long long int类型的最大值：LLONG_MAX    +9223372036854775807 // 2^63−1 — unsigned long long int类型的最大值：ULLONG_MAX    18446744073709551615 // 2^64−1 足敷使用了。唯一的问题是楼主比较守旧，抱着过时的编译器不放。在这种情况下，让他苦恼去吧。  PS：不让用if else，楼主居然还用了if else，朕深鄙之。不是说，学的是语言，而不是编译器么？这关编译器什么事？什么才是主流的编译器？[/quote] 问题在于语言把有些事情推给了编译器。典型的比如int类型的长度。