UVA10494

这道题是大数和小数之间的运算,并不是大数和大数的问题,但我总是喜欢把问题想复杂,

真是淡淡的忧伤,先贴上我自己写的调试了好久才A掉的又长又乱的代码,然后再贴上别人的

集中代码以供参考:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<ctime>
#define MAXN 10000
using namespace std;
char s[MAXN];
char ss[MAXN];
char sss[MAXN];
long long s1[MAXN];
long long s2[MAXN];
void  Multi(long long n)
{
int len=strlen(s);
for(int i=0;i<len;i++)
s1[i]=s[i]-'0';
long long sum=0;
int len1=0;
for(int i=0;i<len;i++)
{
sum=sum*10+s1[i];
if(sum>=n)
{
s2[i]=sum/n;
sum=sum-sum/n*n;
}
else
{
s2[i]=0;
}
}
int i=0;
while(s2[i]==0)
i++;
for(;i<len;i++)
ss[len1++]=s2[i]+'0';
ss[len1]='\0';
}
void Pow(long long n)
{
memset(s1,0,sizeof(s1));
int len=strlen(ss);
for(int i=len-1;i>=0;i--)
{
s1[len-1-i]=ss[i]-'0';
}
int c=0;
for(int i=0;i<len;i++)
{
s1[i]=s1[i]*n+c;
c=s1[i]/10;
s1[i]%=10;
}
while(c!=0)
{
s1[len]=c%10;
c/=10;
len++;
}
for(int i=len-1;i>=0;i--)
ss[len-1-i]=s1[i]+'0';
ss[len]='\0';
}
void Sub()
{
int len=strlen(s);
int len1=strlen(ss);
for(int i=0;i<len;i++)
s1[i]=s[i]-'0';
for(int i=0;i<len1;i++)
s2[i]=ss[i]-'0';
for(int i=len-1,j=len1-1;i>=0&&j>=0;i--,j--)
{
if(s1[i]<s2[j])
{
s1[i]=10+s1[i];
s1[i-1]--;
}
s1[i]=s1[i]-s2[j];
}
for(int i=len-1;i>0;i--)
if(s1[i]<0)
{
s1[i]+=10;
s1[i-1]--;
}
int i=0;
while(s1[i]==0) 
{
i++;

int len2=0;
for(;i<len;i++)
ss[len2++]=s1[i]+'0';
ss[len2]='\0';
}
int main()
{
long long n;
char c;
while(scanf("%s %c %lld",s,&c,&n)!=EOF)
{

memset(ss,0,sizeof(ss));
if(c=='/')
Multi(n);
else
{
Multi(n);
Pow(n);
Sub();
}
if(ss[0]=='\0')
printf("0\n");
else
puts(ss);
}
return 0;
}

先贴上最简洁的代码:

#include <cstdio> 
#include <cstring> 
const int maxsize=10000000; 
char s[maxsize],ans[maxsize]; 
int main() 
     char c; 
     long long b,a; 
     memset (s,0,maxsize); 
     while ( scanf ( "%s %c %lld" ,s,&c,&b)!=EOF) 
    
         memset (ans,0,maxsize); 
         int i; 
         a=0; 
         int j=0; 
         int len= strlen (s); 
         for (i=0;i<len;++i) 
        
             a=a*10+s[i]- '0'
             ans[j++]=a/b+ '0'
             a=a%b; 
        
         if (c== '%'
             printf ( "%lld\n" ,a); 
         else 
        
             i=0; 
             while (ans[i]== '0' )++i; 
             if (ans[i]==0)--i; 
             for (;i<=j-1;++i) 
                 printf ( "%c" ,ans[i]); 
             printf ( "\n" ); 
        
    
     return 0; 
再贴一个用sscanf写的:

思路: 从被除数的高位开始for(i:0 -> strlen(被除数)), 用每次用sscanf(str, "%d", &num)读入i位(要截断) num 跟除数做除法 跟 mod运算。 除的结果放入rslt[i]中, mod的结果ssprintf()回str。

  1. #include <cstdio>  
  2. #include <cstring>  
  3. using namespace std;  
  4.   
  5. #define MAX_BIT 1100  
  6.   
  7. void solve(char *str, long long second, char sign) {  
  8.     int len = strlen(str);  
  9.     char rslt[MAX_BIT];  
  10.     memset(rslt, 0, sizeof(rslt));  
  11.   
  12.     for (int i = 0; i < len; i++) {  
  13.         char sTp[MAX_BIT], ch;  
  14.         memset(sTp, 0, sizeof(sTp));  
  15.         long long iTp;  
  16.         ch = str[i+1];  
  17.       
  18.         str[i+1] = '\0';  
  19.         sscanf(str, "%s", sTp);  
  20.         sscanf(sTp, "%lld", &iTp);  
  21.         rslt[i] = (iTp / second) + '0';  
  22.         sprintf(str, "%*lld", i+1, iTp % second);  
  23.         str[i+1] = ch;  
  24.     }  
  25.   
  26.     int i;  
  27.     if (sign != '%') {  
  28.         for (i = 0; rslt[i] == '0'; i++);  
  29.         if (rslt[i] == '\0') {  
  30.             puts("0");  
  31.         } else {  
  32.             puts(rslt + i);  
  33.         }  
  34.     } else {  
  35.         for (i = 0; str[i] == ' '; i++);  
  36.         puts(str + i);  
  37.     }  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.     char str[MAX_BIT], sign;  
  43.     memset(str, 0, sizeof(str));  
  44.     long long second;  
  45.     while (scanf("%s %c %lld", str, &sign, &second) == 3) {  
  46.         solve(str, second, sign);  
  47.     }  
  48.   
  49.     return 0;  
  50. }  
再贴一个用结构体写的:

 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 struct bign
 5 {
 6     int len;
 7     int s[1000];
 8 };
 9 bign a,res;
10 char str[1000];
11 long b;
12 void change(bign *a)
13 {
14     int i;
15     a->len=strlen(str);
16     for(i=0;i<a->len;i++)
17         a->s[i]=str[i]-'0';
18 }
19 void div()
20 {
21     int i,j=0;
22     long num=0;
23     for(i=0;i<a.len;i++)
24     {
25         num=num*10+a.s[i];
26         res.s[j]=num/b;
27         num=num%b;
28         j++;
29     }
30     (&res)->len=j;
31 }
32 long mod()
33 {
34     int i,j;
35     long ans=0;
36     for(i=0;i<a.len;i++)
37     {
38         ans=ans*10+a.s[i];
39         ans=ans%b;
40     }
41     return ans;
42 }
43 int main()
44 {
45     char c;
46     while(scanf("%s %c %ld",str,&c,&b)!=EOF)
47     {
48         change(&a);
49         if(c=='/')
50         {
51             int i=0,j;
52             div();
53             while(i<res.len-1&&res.s[i]==0)
54                 ++i;
55             for(j=i;j<res.len;j++)
56             {
57                 printf("%d",res.s[j]);
58             }
59             printf("\n");
60         }
61         else if(c=='%')
62         {
63             long aa;
64             aa=mod();
65             printf("%ld\n",aa);
66         }
67     }
68     return 0;
69 }
最后贴一个通用的用bign类写的:

  1. //#define LOCAL  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4. #include <iostream>    
  5. using namespace std;    
  6.     
  7. int const MAXN = 800;    
  8.     
  9. class BigNumber    
  10. {    
  11. public:    
  12.     int s[MAXN];    
  13.     int len;    
  14. public:    
  15.     // 去除前导零    
  16.     void cleanLeadZero();    
  17.     // 乘以10的n次方    
  18.     void multiplyTen(int n);    
  19.     // 除以10的n次方    
  20.     void divisionTen(int n);    
  21.     // 将结果转换成字符串    
  22.     string str() const;    
  23.     // 构造函数    
  24.     BigNumber();    
  25.     BigNumber(int);    
  26.     BigNumber(const char *);    
  27.     // 截取整数的前n位数(例如1234434 调用getSub(3)的话得到的结果是123)    
  28.     BigNumber getSub(int n) const;    
  29.     // 重载赋值运算符    
  30.     BigNumber operator = (const char *);    
  31.     BigNumber operator = (int num);    
  32.     // 重载加减乘除    
  33.     BigNumber operator + (const BigNumber &) const;    
  34.     BigNumber operator - (const BigNumber &) const;    
  35.     BigNumber operator * (const BigNumber &) const;    
  36.     BigNumber operator / (const BigNumber &) const;    
  37.     BigNumber operator % (const BigNumber &) const;    
  38.     BigNumber operator -= (const BigNumber &);    
  39.     BigNumber operator += (const BigNumber &);    
  40.     BigNumber operator *= (const BigNumber &);    
  41.     BigNumber operator /= (const BigNumber &);    
  42.     // 重载比较运算符    
  43.     bool operator < (const BigNumber &) const;    
  44.     bool operator > (const BigNumber &) const;    
  45.     bool operator <= (const BigNumber &) const;    
  46.     bool operator >= (const BigNumber &) const;    
  47.     bool operator == (const BigNumber &) const;    
  48.     // 重载输入输出流    
  49.     friend istream & operator >> (istream &, BigNumber &);    
  50.     friend ostream & operator << (ostream &, BigNumber &);    
  51.     
  52. };    
  53.     
  54. void BigNumber::cleanLeadZero() {    
  55.     while (len > 1 && !s[len - 1]) len--;    
  56. }    
  57.     
  58. void BigNumber::divisionTen(int n)    
  59. {    
  60.     int i;    
  61.     if (n > len) {    
  62.         while (len >= 1) s[len--] = 0;    
  63.     } else {    
  64.         for (i = 0; i < len - n; i++)     
  65.         {    
  66.             s[i] = s[i + n];    
  67.         }    
  68.         len -= n;    
  69.     }    
  70. }    
  71.     
  72. void BigNumber::multiplyTen(int n)    
  73. {    
  74.     if (n > 0) {    
  75.         int i;    
  76.         for (i = len - 1; i >= 0; i--)     
  77.         {    
  78.             s[i + n] = s[i];    
  79.         }    
  80.         for (i = 0; i < n; i++) {    
  81.             s[i] = 0;    
  82.         }    
  83.         len += n;    
  84.     }    
  85. }    
  86.     
  87. string BigNumber::str() const    
  88. {    
  89.     string res = "";    
  90.     // 每个位的数逆序添加到str末尾。    
  91.     for (int i = 0;  i < len; i++) {    
  92.         res = (char)(s[i] + '0') + res;    
  93.     }    
  94.     if (res == "") res = "0";    
  95.     return res;    
  96. }    
  97.     
  98. BigNumber::BigNumber()     
  99. {    
  100.     memset(s, 0, sizeof(s));    
  101.     len = 1;    
  102. }    
  103.     
  104. BigNumber::BigNumber(int num) {    
  105.     *this = num;    
  106. }    
  107.     
  108. BigNumber::BigNumber(const char * num) {    
  109.     *this = num;    
  110. }    
  111.     
  112. BigNumber BigNumber::getSub(int n) const     
  113. {    
  114.     BigNumber c;    
  115.     c.len = 0;    
  116.     for (int i = 0; i < n; i++) {    
  117.         c.s[c.len++] = s[len - n + i];    
  118.     }    
  119.     return c;    
  120. }    
  121.     
  122. BigNumber BigNumber::operator = (const char * num)     
  123. {    
  124.     len = strlen(num);    
  125.     // 整数在s数组中是逆序存放的(如:"456" 在s数组中是s[0] = 6, s[1] = 5, s[2] = 4)    
  126.     for (int i = 0; i < len; i++) {    
  127.         s[i] = num[len - i - 1] - '0';    
  128.     }    
  129.     return *this;    
  130. }    
  131.     
  132. BigNumber BigNumber::operator = (int num) {    
  133.     char s[MAXN];    
  134.     sprintf(s, "%d", num);    
  135.     *this = s;    
  136.     return *this;    
  137. }    
  138.     
  139. BigNumber BigNumber::operator + (const BigNumber & x) const    
  140. {    
  141.     BigNumber r;    
  142.     r.len = 0;    
  143.     // up 是用来保持进位的    
  144.     int i, up;    
  145.     int maxLen = max(len, x.len);    
  146.     for (i = 0, up = 0; up || i < maxLen; i++) {    
  147.         int temp = up;    
  148.         if (i < len) temp += s[i];    
  149.         if (i < x.len) temp += x.s[i];    
  150.         up = temp / 10;    
  151.         r.s[r.len++] = temp % 10;    
  152.     }    
  153.     // 去除前导零    
  154.     r.cleanLeadZero();    
  155.     return r;    
  156. }    
  157.     
  158. // 减法在使用时要注意在计算a - b时要确保a >= b;    
  159. // 如果a < b 则计算 先输出一个'-' 再输出b - a 的结果    
  160. BigNumber BigNumber::operator - (const BigNumber & b) const     
  161. {    
  162.     BigNumber c;    
  163.     c.len = 0;    
  164.     int i;    
  165.     // 用来保存退位    
  166.     int down;    
  167.     for (i = 0, down = 0; i < len; i++)     
  168.     {    
  169.         int temp = s[i] - down;    
  170.         if (i < b.len) temp  -= b.s[i];    
  171.         if (temp >= 0) down = 0;    
  172.         else {    
  173.             down = 1;    
  174.             temp += 10;    
  175.         }    
  176.         c.s[c.len++] = temp;    
  177.     }    
  178.     c.cleanLeadZero();    
  179.     return c;    
  180. }    
  181.     
  182. BigNumber BigNumber::operator * (const BigNumber & b) const    
  183. {    
  184.     int i, j;    
  185.     BigNumber c;    
  186.     c.len = len + b.len;    
  187.     for (i = 0; i < len; i++) {    
  188.         for (j = 0; j < b.len; j++) {    
  189.             c.s[i + j] += s[i] * b.s[j];    
  190.         }    
  191.     }    
  192.         
  193.     for (i = 0; i < c.len - 1; i++) {    
  194.         c.s[i + 1] += c.s[i] / 10;    
  195.         c.s[i] %= 10;    
  196.     }    
  197.     c.cleanLeadZero();    
  198.     return c;    
  199. }    
  200.     
  201. BigNumber BigNumber::operator / (const BigNumber & b) const    
  202. {    
  203.     int i, j;    
  204.     BigNumber r;    
  205.     r.len = 0;    
  206.     // 模拟除法的过程    
  207.     // 先取blen - 1位    
  208.     BigNumber temp = this->getSub(b.len - 1);    
  209.     // 一位一位的除从而取得完整的答案    
  210.     for (i = len - b.len; i >= 0; i--)     
  211.     {    
  212.         // temp用来存储被除数的前blen位。    
  213.         temp = temp * 10 + s[i];    
  214.         // 如果temp < b则再在该位的结果为0    
  215.         if (temp < b) {    
  216.             r.s[r.len++] = 0;    
  217.         } else {    
  218.             // 否则找到第一个j使得b * j的结果大于 temp    
  219.             for (j = 1; j <= 10; j++) {    
  220.                 if (b * j > temp) break;    
  221.             }    
  222.             // 因为此时(j - 1) * b小于等于temp,所有j - 1就是在该位除的结果    
  223.             r.s[r.len++] = j - 1;    
  224.             // temp 减去被减去部分为下一次迭代做准备    
  225.             temp = temp - (b * (j - 1));    
  226.         }    
  227.     }    
  228.     // 逆序(因为结果是要逆序存储的,而在求解过程中结果是顺序存储的)    
  229.     for (i = 0; i < r.len / 2; i++) {    
  230.         int temp = r.s[i];    
  231.         r.s[i] = r.s[r.len - 1 - i];    
  232.         r.s[r.len - 1 - i] = temp;    
  233.     }    
  234.     r.cleanLeadZero();    
  235.     return r;    
  236. }    
  237.     
  238. BigNumber BigNumber::operator % (const BigNumber & b) const     
  239. {    
  240.     BigNumber r;    
  241.     r = *this / b;    
  242.     //cout << r << endl;    
  243.     r = *this - r * b;    
  244.     return r;    
  245. }    
  246.     
  247. BigNumber BigNumber::operator += (const BigNumber & b)     
  248. {    
  249.     *this = *this + b;    
  250.     return *this;    
  251. }    
  252.     
  253. BigNumber BigNumber::operator -= (const BigNumber & b)    
  254. {    
  255.     *this = *this - b;    
  256.     return *this;    
  257. }    
  258.     
  259. BigNumber BigNumber::operator *= (const BigNumber & b)    
  260. {    
  261.     *this = *this * b;    
  262.     return *this;    
  263. }    
  264.     
  265. BigNumber BigNumber::operator /= (const BigNumber & b)     
  266. {    
  267.     *this = *this / b;    
  268.     return *this;    
  269. }    
  270.     
  271. bool BigNumber::operator < (const BigNumber & b) const    
  272. {    
  273.     if (len != b.len) return len < b.len;    
  274.     else {    
  275.         for (int i = len - 1; i >= 0; i--) {    
  276.             if (s[i] != b.s[i]) return s[i] < b.s[i];    
  277.         }    
  278.     }    
  279.     return false;    
  280. }    
  281.     
  282. bool BigNumber::operator > (const BigNumber & b) const    
  283. {    
  284.     return b < *this;    
  285. }    
  286.     
  287. bool BigNumber::operator <= (const BigNumber & b) const    
  288. {    
  289.     return !(b > *this);    
  290. }    
  291.     
  292. bool BigNumber::operator >= (const BigNumber & b) const    
  293. {    
  294.     return !(*this < b);    
  295. }    
  296.     
  297. bool BigNumber::operator == (const BigNumber & b) const    
  298. {    
  299.     return !(b < *this) && !(b > *this);    
  300. }    
  301.     
  302. istream & operator >> (istream & in, BigNumber & x)    
  303. {    
  304.     string s;    
  305.     in >> s;    
  306.     x = s.c_str();    
  307.     return in;    
  308. }    
  309.     
  310. ostream & operator << (ostream & out, BigNumber & x)    
  311. {    
  312.     out << x.str();    
  313.     return out;    
  314. }    
  315.     
  316. char a[1000];    
  317. char b[100];    
  318. char op;    
  319.     
  320. int main()    
  321. {    
  322. #ifdef LOCAL    
  323.     freopen("input.txt""r", stdin);    
  324.     //freopen("output.txt", "w", stdout);   
  325. #endif    
  326.     while (scanf("%s %c %s", a, &op, b) != EOF) {    
  327.         BigNumber d(a);    
  328.         BigNumber k(b);    
  329.         d.cleanLeadZero();    
  330.         k.cleanLeadZero();    
  331.         if (op == '/') {    
  332.             cout << (d / k).str() << endl;    
  333.         } else {    
  334.             cout << (d % k).str() << endl;    
  335.         }    
  336.     }    
  337.     return 0;    
  338. }    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值