1. 程式人生 > >{大數模板}

{大數模板}

compare bsp length gif .net .com using -c 高精度加法

路過http://blog.csdn.net/qq_18661257/article/details/51416202?locationNum=7&fps=1

技術分享
  1 #include<stdio.h>
  2 #include<string>
  3 #include<string.h>
  4 #include<iostream>
  5 using namespace std;
  6 
  7 //compare比較函數:相等返回0,大於返回1,小於返回-1
  8 int compare(string str1,string str2)
  9
{ 10 if(str1.length()>str2.length()) return 1; 11 else if(str1.length()<str2.length()) return -1; 12 else return str1.compare(str2); 13 } 14 //高精度加法 15 //只能是兩個正數相加 16 string add(string str1,string str2)//高精度加法 17 { 18 string str; 19 20 int len1=str1.length(); 21 int
len2=str2.length(); 22 //前面補0,弄成長度相同 23 if(len1<len2) 24 { 25 for(int i=1;i<=len2-len1;i++) 26 str1="0"+str1; 27 } 28 else 29 { 30 for(int i=1;i<=len1-len2;i++) 31 str2="0"+str2; 32 } 33 len1=str1.length(); 34 int
cf=0; 35 int temp; 36 for(int i=len1-1;i>=0;i--) 37 { 38 temp=str1[i]-0+str2[i]-0+cf; 39 cf=temp/10; 40 temp%=10; 41 str=char(temp+0)+str; 42 } 43 if(cf!=0) str=char(cf+0)+str; 44 return str; 45 } 46 //高精度減法 47 //只能是兩個正數相減,而且要大減小 48 string sub(string str1,string str2)//高精度減法 49 { 50 string str; 51 int tmp=str1.length()-str2.length(); 52 int cf=0; 53 for(int i=str2.length()-1;i>=0;i--) 54 { 55 if(str1[tmp+i]<str2[i]+cf) 56 { 57 str=char(str1[tmp+i]-str2[i]-cf+0+10)+str; 58 cf=1; 59 } 60 else 61 { 62 str=char(str1[tmp+i]-str2[i]-cf+0)+str; 63 cf=0; 64 } 65 } 66 for(int i=tmp-1;i>=0;i--) 67 { 68 if(str1[i]-cf>=0) 69 { 70 str=char(str1[i]-cf)+str; 71 cf=0; 72 } 73 else 74 { 75 str=char(str1[i]-cf+10)+str; 76 cf=1; 77 } 78 } 79 str.erase(0,str.find_first_not_of(0));//去除結果中多余的前導0 80 return str; 81 } 82 //高精度乘法 83 //只能是兩個正數相乘 84 string mul(string str1,string str2) 85 { 86 string str; 87 int len1=str1.length(); 88 int len2=str2.length(); 89 string tempstr; 90 for(int i=len2-1;i>=0;i--) 91 { 92 tempstr=""; 93 int temp=str2[i]-0; 94 int t=0; 95 int cf=0; 96 if(temp!=0) 97 { 98 for(int j=1;j<=len2-1-i;j++) 99 tempstr+="0"; 100 for(int j=len1-1;j>=0;j--) 101 { 102 t=(temp*(str1[j]-0)+cf)%10; 103 cf=(temp*(str1[j]-0)+cf)/10; 104 tempstr=char(t+0)+tempstr; 105 } 106 if(cf!=0) tempstr=char(cf+0)+tempstr; 107 } 108 str=add(str,tempstr); 109 } 110 str.erase(0,str.find_first_not_of(0)); 111 return str; 112 } 113 114 //高精度除法 115 //兩個正數相除,商為quotient,余數為residue 116 //需要高精度減法和乘法 117 void div(string str1,string str2,string "ient,string &residue) 118 { 119 quotient=residue="";//清空 120 if(str2=="0")//判斷除數是否為0 121 { 122 quotient=residue="ERROR"; 123 return; 124 } 125 if(str1=="0")//判斷被除數是否為0 126 { 127 quotient=residue="0"; 128 return; 129 } 130 int res=compare(str1,str2); 131 if(res<0) 132 { 133 quotient="0"; 134 residue=str1; 135 return; 136 } 137 else if(res==0) 138 { 139 quotient="1"; 140 residue="0"; 141 return; 142 } 143 else 144 { 145 int len1=str1.length(); 146 int len2=str2.length(); 147 string tempstr; 148 tempstr.append(str1,0,len2-1); 149 for(int i=len2-1;i<len1;i++) 150 { 151 tempstr=tempstr+str1[i]; 152 tempstr.erase(0,tempstr.find_first_not_of(0)); 153 if(tempstr.empty()) 154 tempstr="0"; 155 for(char ch=9;ch>=0;ch--)//試商 156 { 157 string str,tmp; 158 str=str+ch; 159 tmp=mul(str2,str); 160 if(compare(tmp,tempstr)<=0)//試商成功 161 { 162 quotient=quotient+ch; 163 tempstr=sub(tempstr,tmp); 164 break; 165 } 166 } 167 } 168 residue=tempstr; 169 } 170 quotient.erase(0,quotient.find_first_not_of(0)); 171 if(quotient.empty()) quotient="0"; 172 } 173 174 175 const int MAXNX = 200 + 5; 176 string C[MAXNX]; 177 void init(){ 178 C[0] = "0"; 179 C[1] = "1"; 180 for(int i = 2;i < MAXNX;i ++) C[i] = add(C[i - 1], C[i - 2]); 181 } 182 183 int N; 184 int main() { 185 init(); 186 while(~scanf("%d", &N)){ 187 cout << C[N + 1] << endl; 188 } 189 return 0; 190 }
Fib 技術分享
  1 #include<stdio.h>
  2 #include<string>
  3 #include<string.h>
  4 #include<iostream>
  5 using namespace std;
  6 
  7 //compare比較函數:相等返回0,大於返回1,小於返回-1
  8 int compare(string str1,string str2)
  9 {
 10     if(str1.length()>str2.length()) return 1;
 11     else if(str1.length()<str2.length())  return -1;
 12     else return str1.compare(str2);
 13 }
 14 //高精度加法
 15 //只能是兩個正數相加
 16 string add(string str1,string str2)//高精度加法
 17 {
 18     string str;
 19 
 20     int len1=str1.length();
 21     int len2=str2.length();
 22     //前面補0,弄成長度相同
 23     if(len1<len2)
 24     {
 25         for(int i=1;i<=len2-len1;i++)
 26            str1="0"+str1;
 27     }
 28     else
 29     {
 30         for(int i=1;i<=len1-len2;i++)
 31            str2="0"+str2;
 32     }
 33     len1=str1.length();
 34     int cf=0;
 35     int temp;
 36     for(int i=len1-1;i>=0;i--)
 37     {
 38         temp=str1[i]-0+str2[i]-0+cf;
 39         cf=temp/10;
 40         temp%=10;
 41         str=char(temp+0)+str;
 42     }
 43     if(cf!=0)  str=char(cf+0)+str;
 44     return str;
 45 }
 46 //高精度減法
 47 //只能是兩個正數相減,而且要大減小
 48 string sub(string str1,string str2)//高精度減法
 49 {
 50     string str;
 51     int tmp=str1.length()-str2.length();
 52     int cf=0;
 53     for(int i=str2.length()-1;i>=0;i--)
 54     {
 55         if(str1[tmp+i]<str2[i]+cf)
 56         {
 57             str=char(str1[tmp+i]-str2[i]-cf+0+10)+str;
 58             cf=1;
 59         }
 60         else
 61         {
 62             str=char(str1[tmp+i]-str2[i]-cf+0)+str;
 63             cf=0;
 64         }
 65     }
 66     for(int i=tmp-1;i>=0;i--)
 67     {
 68         if(str1[i]-cf>=0)
 69         {
 70             str=char(str1[i]-cf)+str;
 71             cf=0;
 72         }
 73         else
 74         {
 75             str=char(str1[i]-cf+10)+str;
 76             cf=1;
 77         }
 78     }
 79     str.erase(0,str.find_first_not_of(0));//去除結果中多余的前導0
 80     return str;
 81 }
 82 //高精度乘法
 83 //只能是兩個正數相乘
 84 string mul(string str1,string str2)
 85 {
 86     string str;
 87     int len1=str1.length();
 88     int len2=str2.length();
 89     string tempstr;
 90     for(int i=len2-1;i>=0;i--)
 91     {
 92         tempstr="";
 93         int temp=str2[i]-0;
 94         int t=0;
 95         int cf=0;
 96         if(temp!=0)
 97         {
 98             for(int j=1;j<=len2-1-i;j++)
 99               tempstr+="0";
100             for(int j=len1-1;j>=0;j--)
101             {
102                 t=(temp*(str1[j]-0)+cf)%10;
103                 cf=(temp*(str1[j]-0)+cf)/10;
104                 tempstr=char(t+0)+tempstr;
105             }
106             if(cf!=0) tempstr=char(cf+0)+tempstr;
107         }
108         str=add(str,tempstr);
109     }
110     str.erase(0,str.find_first_not_of(0));
111     return str;
112 }
113 
114 //高精度除法
115 //兩個正數相除,商為quotient,余數為residue
116 //需要高精度減法和乘法
117 void div(string str1,string str2,string "ient,string &residue)
118 {
119     quotient=residue="";//清空
120     if(str2=="0")//判斷除數是否為0
121     {
122         quotient=residue="ERROR";
123         return;
124     }
125     if(str1=="0")//判斷被除數是否為0
126     {
127         quotient=residue="0";
128         return;
129     }
130     int res=compare(str1,str2);
131     if(res<0)
132     {
133         quotient="0";
134         residue=str1;
135         return;
136     }
137     else if(res==0)
138     {
139         quotient="1";
140         residue="0";
141         return;
142     }
143     else
144     {
145         int len1=str1.length();
146         int len2=str2.length();
147         string tempstr;
148         tempstr.append(str1,0,len2-1);
149         for(int i=len2-1;i<len1;i++)
150         {
151             tempstr=tempstr+str1[i];
152             tempstr.erase(0,tempstr.find_first_not_of(0));
153             if(tempstr.empty())
154               tempstr="0";
155             for(char ch=9;ch>=0;ch--)//試商
156             {
157                 string str,tmp;
158                 str=str+ch;
159                 tmp=mul(str2,str);
160                 if(compare(tmp,tempstr)<=0)//試商成功
161                 {
162                     quotient=quotient+ch;
163                     tempstr=sub(tempstr,tmp);
164                     break;
165                 }
166             }
167         }
168         residue=tempstr;
169     }
170     quotient.erase(0,quotient.find_first_not_of(0));
171     if(quotient.empty()) quotient="0";
172 }
173 
174 
175 const int MAXNX = 200 + 5;
176 string C[MAXNX][MAXNX];
177 void init(){
178     for(int i = 0;i < MAXNX;i ++){
179         for(int j = 0;j < MAXNX;j ++){
180             C[i][j] = "0";
181         }
182     }
183     for(int i = 1;i < MAXNX;i ++){
184         for(int j = 0;j <= i;j ++){
185             if(j == 0) C[i][0] = "1";
186             else{
187                 C[i][j] = add(C[i - 1][j - 1],C[i - 1][j]);
188             }
189         }
190     }
191 }
192 
193 int N;
194 int main() {
195     init();
196     while(~scanf("%d", &N)){
197         string res = "0";
198         for(int i = 0;i <= (N + 1)/ 2;i ++){
199             res = add(res,C[N - i + 1][i]);
200         }
201         cout << res << endl;
202     }
203     return 0;
204 }
ComB

{大數模板}