C语言细节 一些常用代码

1.读取指定组数据:

//方法1:
#include <stdio.h>

int main(void) {
	int t,i;
	scanf("%d",&t);
	fflush(stdin);
	for (i=0;i<t;i++) {//或while (t--) {}
		printf("input:");
	    scanf("...");
	    fflush(stdin);
	}
	return 0;
}

//方法2:
#include <stdio.h>

int main(void) {
	int t;
	scanf("%d",&t);
	fflush(stdin);
	while (t--) {
		printf("input:");
	    scanf("...");
	    fflush(stdin);
	}
	return 0;
} 

//结果:
4
input:...
input:...
input:...
input:...

2.读取数据直到收到结束命令:

//方法1:
#include <stdio.h>

int main(void) {
	while (scanf("...")!=EOF) {
		printf("input:...\n");
		fflush(stdin);
	}
	return 0;
} 

//方法2:
#include <stdio.h>

int main(void) {
	while (~scanf("...")) {
		printf("input:...\n");
		fflush(stdin);
	}
	return 0;
}

//结果:
...
input:...
...
input:...
^Z

3.求最大公约数和最小公倍数:

#include <stdio.h>

int gcd(int x,int y) {//求最大公因数 
	return y?gcd(y,x%y):x;
}

int lcm(int x,int y) {//求最小公倍数 
	return x*y/gcd(x,y);
}

int main(void) {
	printf("%d\n",gcd(17,102));//结果:17
	printf("%d\n",lcm(22,6));//结果:66
	return 0;
}

3.将10进制数转换为b进制:

#include <stdio.h>
#define LEN 32*sizeof(int)
#define B 3

int main(void) {
	int x=123,cnt=0,a[LEN];
	while (x) {
		a[cnt]=x%B;
		x/=B;
		cnt++;
	}
	int i;
	for (i=cnt;i;i--) {
		printf("%d",a[i-1]);
	}
	return 0;
}
//结果:
11120

4.整数的各位上的数字的和:

#include <stdio.h>

int main(void) {
	int x=123,ai=0;
	while (x) {
		ai+=x%10;
		x/=10;
	}
	printf("%d",ai);//结果:6
	return 0;
}

5.将整数分解为质因数:

#include <stdio.h>
#define N 132

int main(void) {
	int x=N,i;
	for (i=2;i*i<=N&&x>1;i++) {
		while (x%i==0) {
			x/=i;
			printf("%d ",i);
		}
	}
	if (x>1) {
		printf("%d ",x);
	}
	return 0;
}
//结果:
2 2 3 11

6.求整数的全部因子(除1和自身外):

#include <stdio.h>
#define N 132

int main(void) {
	int x=N,i;
	for (i=2;i*i<=N;i++) {
		if (N%i) {
			continue;
		}
		printf("%d ",i);
		if (i*i!=N) {
			printf("%d ",N/i);
		}
	}
	return 0;
}
//结果:
2 66 3 44 4 33 6 22 11 12

7.计算数组中指定值出现的次数:

//下例仅统计小写字母:
#include <stdio.h>
#define LEN 12

int main(void) {
	char s[LEN]="adeaydffgysa";
	int a[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	int i;
	for (i=0;i<LEN;i++) {
		a[s[i]-'a']++;
	}
	for (i=0;i<26;i++) {
		printf("%d ",a[i]);
	}
	return 0;
}
//结果:
3 0 0 2 1 2 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2 0

8.高精度运算
(1)加法:

#include <stdio.h>
#define PRE 500//最大位数 

int main(void) {
	int a[PRE]={1,2,3,4,1,2,4,3,3,6,1},b[PRE]={1,2,3,4,1,2,4,3,3,6,1},c[PRE],x=0,i;
	for (i=0;i<=PRE;i++) {
		c[i]=a[i]+b[i]+x; 
		x=c[i]/10;
		c[i]%=10;
	}
	for (i=0;i<PRE;i++) {
		printf("%d",c[i]);
	}
	return 0;
}
//结果:
2468248662300000000000...

(2)减法:

#include <stdio.h>
#define PRE 500//最大位数 

int main(void) {
	int a[PRE]={3,1,3,6,1,1,4,3,7,2,1},b[PRE]={1,2,3,4,1,2,4,3,3,6,1},c[PRE],x=0,i;
	for (i=0;i<=PRE;i++) {
		c[i]=a[i]-b[i]-x; 
		if (c[i]<0) {
			c[i]+=10;
			x=1;
		} else {
			x=0;
		}
	}
	for (i=0;i<PRE;i++) {
		printf("%d",c[i]);
	}
	return 0;
}
//结果:
2991099936999...

(3)乘法:

#include <stdio.h>
#define PRE1 11//位数
#define PRE2 11

int main(void) {
	int a[PRE1]={3,1,3,6,1,1,4,3,7,2,1},b[PRE2]={1,2,3,4,1,2,4,3,3,6,1},c[PRE1+PRE2],x,i;
	for (i=0;i<PRE1+PRE2;i++) {
		c[i]=0;
		int j;
		for (j=0;j<=i;j++) {
			if (0<=j&&j<PRE1&&0<=(i-j)&&(i-j)<PRE2) {
				c[i]+=a[j]*b[i-j];
			}
		}
	}
	for (i=0,x=0;i<PRE1+PRE2;i++) {
		c[i]+=x;
		x=c[i]/10;
		c[i]%=10;
	}
	for (i=0;i<PRE1+PRE2;i++) {
		printf("%d",c[i]);
	}
	return 0;
}
//结果:
3748134805405871008020

(4)除法:

(5)取模:

#include <stdio.h>
#define PRE 500//最大位数
#define P 7//求除P后的余数

int main(void) {
	int a[PRE]={1,2,3,4,5,6,7,8,9},ans=0,n=9,i;//n是位数
	for (i=0;i<n;i++) {
		ans=((long long)(ans*10)+a[i])%P;
	}
	printf("%d",ans);//结果:1
	return 0;
}

9.二分法求方程的根:

#include <stdio.h>
#include <math.h>
#define PRE 1e-20//根的精度 
#define EQUA(X) sin(X)-2e-8

int main(void) {
	double l=-1,r=1,m;
	while (r-l>PRE) {
		m=(l+r)/2;
		if (EQUA(m)<0) {
			l=m;
		} else {
			r=m;
		}
	}
	printf("%.22f",l);//结果:0.0000000199999999999964
	return 0;
}

10.求逆序对数量:

#include <stdio.h>
#define LEN 10

int main(void) {
	int a[LEN]={1,2,3,4,5,2,7,8,9,1},ans=0,i;
	for (i=1;i<LEN;i++) {
		int j;
		for (j=1;j<i;j++) {
			ans+=a[i]<a[j];
		}
	}
	printf("%d",ans);//结果:11
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值