Jzoj 进制与高精度部分代码(共23题)

1047: 【入门】正整数N转换成一个二进制数

#include 
using namespace std;
int n, a[20], len;
int main()
{scanf("%d", &n);//这道题不讲武德, 题目说的是正整数, 测试样例却有0 if(n==0){printf("0");return 0;}while(n){len++;a[len]=n%2;n/=2;}for(int i=len; i>=1; --i){printf("%d", a[i]);}return 0;
}

1080: 【基础】挑战赛第三题——二进制中的1

#include 
using namespace std;
int n, len;
int main()
{scanf("%d", &n);while(n){if(n%2){printf("%d\n", len);}n/=2;len++;}return 0;
}

1557: 【入门】二进制中1的个数

#include 
using namespace std;
int n, ans;
int main()
{scanf("%d", &n);while(n){if(n%2){ans++;}n/=2;}printf("%d", ans);return 0;
}

1127: 【入门】A类多?B类多?

#include 
using namespace std;
int n, temp, totala, totalb, cura, curb;
int main()
{scanf("%d", &n);for(int i=1; i<=n; ++i){temp=i;cura=curb=0;while(temp){if(temp%2){cura++;}else{curb++;}temp/=2;}if(cura>curb){totala++;}else{totalb++;}} printf("%d %d", totala, totalb);return 0;
}

1258: 【基础】任意进制转换

#include 
using namespace std;
int n, b, len;
char a[20];
string r="0123456789ABCDEFGHIJ";
int main()
{scanf("%d %d", &n, &b);while(n){len++;a[len]=r[n%b];n/=b;}for(int i=len; i>=1; --i){printf("%c", a[i]);}return 0;
}

1288: 【基础】二进制转十进制

#include 
using namespace std;
int n, len;
char a[33];
int main()
{scanf("%s", &a);len=strlen(a);for(int i=0; i

1128: 【基础】二进制小数

#include 
using namespace std;
double n;
int m, ans;
int main()
{scanf("%lf %d", &n, &m);n=n-floor(n);while(m--){n*=2;ans=floor(n);n=n-ans;}printf("%d", ans);return 0;
}

1843: 【基础】十六进制转换

#include 
using namespace std;
char a[100010];
int b[400010], ans[200010];
int len, num, lenans;
bool flag;
int main()
{scanf("%s", &a);len=strlen(a);//从最低位开始, 一个十六进制拆成4个二进制 for(int i=len-1; i>=0; --i){//将十六进制字符a[i]变为整数num if(a[i]>='0' && a[i]<='9'){num=a[i]-'0';}else if(a[i]>='A' && a[i]<='F'){num=a[i]-'A'+10; }//将第i位上的十六进制数转换为第4*i~4*(i+1)-1位的二进制数 for(int j=4*(i+1)-1; j>=4*i; --j){b[j]=num%2;num/=2;}}//从最低位开始, 3个二进制合并为1个八进制 for(int i=4*len-1; i>=0;){if(i>=2){num=b[i-2]*4+b[i-1]*2+b[i];i-=3;lenans++;ans[lenans]=num;}else if(i==1){num=b[i-1]*2+b[i];i-=2;lenans++;ans[lenans]=num;}else if(i==0){num=b[i];i--;lenans++;ans[lenans]=num;}}for(int i=lenans; i>=1; --i){if(ans[i]==0 && !flag){continue;}if(ans[i]!=0){flag=true;}printf("%d", ans[i]);}if(len==1 && a[0]=='0'){printf("0");}return 0;
}

1300: 【基础】智破奇案

#include 
using namespace std;
int n, len, num, temp[11], curlen;
char a[300];
int main()
{scanf("%d %s", &n, &a);len=strlen(a);for(int i=0; i=1; --j) {printf("%d", temp[j]);}num=0;curlen=0;continue;}num=num*8+a[i]-'0';	}if(num==0){	//可能为0 printf("0");} while(num){curlen++;temp[curlen]=num%10;num/=10;}for(int j=curlen; j>=1; --j) {printf("%d", temp[j]);}return 0;
}

1559: 【入门】N!中1的位置

#include 
using namespace std;
int n, ans=1, fac=1;
int main()
{scanf("%d", &n);for(int i=1; i<=n; ++i){fac*=i;while(fac%2==0){ans++;fac>>=1;}}printf("%d", ans);return 0;
} 

1916: 【基础】-2进制

#include 
using namespace std;
int n, cnt, a[100];
int main()
{scanf("%d", &n);if(n==0){printf("0");return 0;}while(n){cnt++;a[cnt]=abs(n%2);n=(n-a[cnt])/-2;}for(int i=cnt; i>=1; --i){printf("%d", a[i]);}return 0;
}

2492: 【提高】负进制

asd

1188: 【基础】高精度加法

#include 
using namespace std;
char s1[510], s2[510];
int a[510], b[510], sum[510];
int lena, lenb, lens;
int main()
{cin >> s1 >> s2;lena=strlen(s1);lenb=strlen(s2);lens=max(lena, lenb);for(int i=1; i<=lena; ++i){a[i]=s1[lena-i]-'0';}for(int i=1; i<=lenb; ++i){b[i]=s2[lenb-i]-'0';}for(int i=1; i<=lens; ++i){sum[i]=sum[i]+a[i]+b[i];if(sum[i]>=10){sum[i+1]=sum[i+1]+sum[i]/10;sum[i]%=10;}} if(sum[lens+1]){lens++;}for(int i=lens; i>=1; --i){cout << sum[i];}return 0;
}

1812: 【基础】高精度减法

#include 
using namespace std;
char a[10087], b[10087], tmp[10087];
int lena, lenb, len, num1[10087], num2[10087], ans[10087];
int main()
{cin >> a >> b;lena=strlen(a);lenb=strlen(b);len=max(lena, lenb);//如果ab, strcmp(a,b)>0 //a小于b的情况   if(lena1; --i){if(ans[i]==0)	len--;elsebreak;}//输出答案 for(int i=len; i>=1; --i){cout << ans[i];}return 0;
}

1189: 【基础】高精度减法

#include 
using namespace std;
string a, b;
int len1, len2, len, num1[10089], num2[10089], ans[10089];
//运算符重载,判断两个数的大小,第一个小于第二个返回true 
bool operator < (string &x, string &y)
{int l1=x.length();int l2=y.length();if(l1l2){return false;}for(int i=0; i> a >> b;//如果a小于b,则为负数,先输出一个负号,再交换a和b的值 if(a=0; --i){//直到最高位出现非0位,退出循环 if(ans[i]!=0){break;}//如果最高位是0,则长度-- if(ans[i]==0){len--;}}//如果a和b相等,最后答案为0,前面会将len变为0 if(len==0)	len++;//输出答案 for(int i=len-1; i>=0; --i){cout << ans[i];}return 0;
}

1547: 【基础】高精度减法

asd

2446: 【提高】高精度减法

asd

1190: 【基础】高精度乘

#include 
using namespace std;
char a[2020], b[2020];
int lena, lenb, len, numa[2020], numb[2020], ans[4040];
int main()
{scanf("%s %s", &a, &b);    //输入两个字符数组lena=strlen(a);    //计算第一个数的位数lenb=strlen(b);    //计算第二个数的位数for(int i=0; i=10){    //处理进位ans[i+j]+=ans[i+j-1]/10;    //进到更高的一位,落实在数组中,下标加一ans[i+j-1]%=10;	    //自己留下余数}}}len=lena+lenb;    //两数相乘最大的位数就是lena+lenb,当然也可能是lena+lenb-1(最高位没有进位时)for(int i=len; i>1; --i){    //处理最高位前面的0,i>1,能保证答案至少有1位if(ans[i]==0){    //如果最高位是0,答案的位数减一len--;}else{    //只要发现有不为0的位,说明答案位数已确定,跳出循环break;}}for(int i=len; i>=1; --i)    //从最高位到最低位依次输出答案printf("%d", ans[i]);return 0;
}

1191: 【基础】高精度乘单精度

#include 
using namespace std;
char a[2020], b[2020];
int lena, lenb, len, numa[2020], numb[2020], ans[4040];
int main()
{scanf("%s %s", &a, &b);    //输入两个字符数组lena=strlen(a);    //计算第一个数的位数lenb=strlen(b);    //计算第二个数的位数for(int i=0; i=10){    //处理进位ans[i+j]+=ans[i+j-1]/10;    //进到更高的一位,落实在数组中,下标加一ans[i+j-1]%=10;	    //自己留下余数}}}len=lena+lenb;    //两数相乘最大的位数就是lena+lenb,当然也可能是lena+lenb-1(最高位没有进位时)for(int i=len; i>1; --i){    //处理最高位前面的0,i>1,能保证答案至少有1位if(ans[i]==0){    //如果最高位是0,答案的位数减一len--;}else{    //只要发现有不为0的位,说明答案位数已确定,跳出循环break;}}for(int i=len; i>=1; --i)    //从最高位到最低位依次输出答案printf("%d", ans[i]);return 0;
}

1508: 【USACO】2的N次方

asd

1083: 【基础】计算N的阶乘

asd

2114: 【提高】过河卒

#include 
using namespace std;
int n, m;
struct node{int num[110];	//最低位(个位)存在num[1] int length;
}ans[110][110];
node operator + (node x, node y)
{node c;c.length=max(x.length, y.length);memset(c.num, 0, sizeof(c.num));for(int i=1; i<=c.length; ++i){c.num[i]+=x.num[i]+y.num[i];if(c.num[i]>=10){c.num[i+1]+=c.num[i]/10;c.num[i]%=10;}} if(c.num[c.length+1]){c.length++;}return c;
}
int main()
{scanf("%d %d", &n, &m);for(int i=1; i<=n; ++i){ans[i][1].num[1]=1;ans[i][1].length=1;}for(int i=1; i<=m; ++i){ans[1][i].num[1]=1;ans[1][i].length=1;}for(int i=2; i<=n; ++i){for(int j=2; j<=m; ++j){ans[i][j]=ans[i-1][j]+ans[i][j-1];}}for(int i=ans[n][m].length; i>=1; --i){printf("%d", ans[n][m].num[i]);	}return 0;
}

2391: 【提高】高精度实数乘法

asd


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部