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

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

#include <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
using namespace std;
int n, len;
char a[33];
int main()
{
	scanf("%s", &a);
	len=strlen(a);
	for(int i=0; i<len; ++i){
		n=n*2+a[i]-'0';
	}
	printf("%d", n);
	return 0;
}

1128: 【基础】二进制小数

#include <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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<len; ++i){
		if(a[i]=='!'){
			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]);
			}
			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 <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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 <bits/stdc++.h>
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);
	//如果a<b, strcmp(a,b)<0
	//如果a==b, strcmp(a,b)=0 
	//如果a>b, strcmp(a,b)>0 
	//a小于b的情况   
	if(lena<lenb || lena==lenb && strcmp(a,b)<0){
		cout << "-";
		swap(a, b); 
		swap(lena, lenb);
//		strcpy(tmp, a);			//tmp=a; 
//		strcpy(a, b);		    //a=b; 
//		strcpy(b, tmp);	        //b=tmp
	}  
	//做a-b 
//	lena=strlen(a);
//	lenb=strlen(b);
	
	//将字符数组a转换为整数数组num1 
	for(int i=0; i<lena; ++i){
		num1[i+1]=a[lena-i-1]-'0';
	}
	//将字符数组b转换为整数数组num2
	for(int i=0; i<lenb; ++i){
		num2[i+1]=b[lenb-i-1]-'0';
	}
	for(int i=1; i<=len; ++i){
		if(num1[i]<num2[i]){
			num1[i]=num1[i]+10;
			num1[i+1]--;
		}
		ans[i]=num1[i]-num2[i];
	}
	//去掉答案前面的0 
	for(int i=len; i>1; --i){
		if(ans[i]==0)	
			len--;
		else
			break;
	}
	//输出答案 
	for(int i=len; i>=1; --i){
		cout << ans[i];
	}
	return 0;
}

1189: 【基础】高精度减法

#include <bits/stdc++.h>
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(l1<l2){
		return true;
	}
	else if(l1>l2){
		return false;
	}
	for(int i=0; i<l1; ++i){
		if(x[i]<y[i]){
			return true;
		}
	}
	return false;
}
int main()
{
	cin >> a >> b;
	//如果a小于b,则为负数,先输出一个负号,再交换a和b的值 
	if(a<b){
		cout << "-";
		swap(a, b);
	}
	len=len1=a.length();
	len2=b.length();
	//字符串转整数数组 
	for(int i=0; i<len1; ++i){
		num1[i]=a[len1-i-1]-'0';
	}
	for(int i=0; i<len2; ++i){
		num2[i]=b[len2-i-1]-'0';
	}
	//做a-b运算 
	for(int i=0; i<len; ++i){
		ans[i]=num1[i]-num2[i];
		//处理借位 
		if(ans[i]<0){
			ans[i]+=10;
			num1[i+1]--;
		}
	}
	//处理最高位的0 
	for(int i=len-1; i>=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 <bits/stdc++.h>
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<lena; ++i){    //将字符数组倒序转换为整数数组,个位从下标1开始
		numa[i+1]=a[lena-i-1]-'0'; 
	}
	for(int i=0; i<lenb; ++i){    //将字符数组倒序转换为整数数组,个位从下标1开始
		numb[i+1]=b[lenb-i-1]-'0'; 
	}
	for(int i=1; i<=lenb; ++i){    //模拟乘法竖式,用第二个数的每一位依次乘以第一个数的每一位
		for(int j=1; j<=lena; ++j){
			ans[i+j-1]+=numb[i]*numa[j];    //第i位和第j位相乘的结果要累加到底i+j-1位
			if(ans[i+j-1]>=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 <bits/stdc++.h>
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<lena; ++i){    //将字符数组倒序转换为整数数组,个位从下标1开始
		numa[i+1]=a[lena-i-1]-'0'; 
	}
	for(int i=0; i<lenb; ++i){    //将字符数组倒序转换为整数数组,个位从下标1开始
		numb[i+1]=b[lenb-i-1]-'0'; 
	}
	for(int i=1; i<=lenb; ++i){    //模拟乘法竖式,用第二个数的每一位依次乘以第一个数的每一位
		for(int j=1; j<=lena; ++j){
			ans[i+j-1]+=numb[i]*numa[j];    //第i位和第j位相乘的结果要累加到底i+j-1位
			if(ans[i+j-1]>=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 <bits/stdc++.h>
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ypeijasd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值