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;
}