作者是零基础捏,仅作个人学习记录,多数题目会有更优解。
有些题目虽然AC了但是可能不严谨。
有错误请务必指正我
我做完之后会看去年学长发的贴子,各位可以直接看他们的,他们的算法确实更优,有些打的注解就是看过他们的文章后加入的。
如果各位有优解可以在评论区或者私信教我hh
1-10水题
1.Hello World
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
2.A+B
#include<stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
return 0;
}
3.数据类型大小及范围
#include<stdio.h>
int main()
{
int d;
scanf("%d",&d);
switch(d){
case 1:printf("1,-128,127");break;
case 2:printf("1,0,255");break;
case 3:printf("2,32768,32767");break;
case 5:printf("4,-2147483648,2147483647");break;
case 6:printf("4,0,4294967295");break;
case 7:printf("4,-2147483648,2147483647");break;
case 8:printf("4,0,4294967295");break;
case 9:printf("8,-9223372036854775808,9223372036854775807");break;
case 10:printf("8,0,18446744073709551615");break;
}
return 0;
}
做这题的时候还不会sizeof(),用生命代替计算机计算了说是。
补:从大佬们那里学到可以用C语言标准库<limits.h>来做,省去手敲数字部分。
4.均值
#include<stdio.h>
int main()
{
long long int a,b,c;
scanf("%lld %lld",&a,&b);
c=a+(b-a)/2;
printf("%lld",c);
return 0;
}
用a+(b-a)/2(这里的“/2”你用位运算符“>>1”也OK)是为了防止溢出,其实我用int类型(a+b)/2也AC了hh.
5.进制转换
#include<stdio.h>
int main()
{
unsigned a;
scanf("%u",&a);
printf("%X,%o",a,a);
return 0;
}
6.浮点数输出
#include<stdio.h>
int main()
{
double a;
scanf("%lf",&a);
printf("%.6lf,%.2lf,%.8lf",a,a,a);
return 0;
}
7.动态宽度输出
#include<stdio.h>
int main()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%0*d",n,m);
return 0;
}
8.计算地球上两点之间的距离
#include<stdio.h>
#include<math.h>
#define PI 3.1415926
double hav(double x);
double cha(double x){
return x*PI/180.0;
}
double func(double a,double b,double c,double d){
return 6371*acos(1-2*((hav(c-a))+cos(a)*cos(c)*hav(d-b)));
}
int main()
{
double a,b,c,d;
scanf("%lf %lf",&a,&b);
scanf("%lf %lf",&c,&d);
printf("%.4lfkm",func(cha(a),cha(b),cha(c),cha(d)));
return 0;
}
double hav(double x){
return sin(x/2)*sin(x/2);
}
输入的是角度,记得转弧度。
9.风寒指数
#include<stdio.h>
#include<math.h>
int chill(double x,double y)
{
double b=13.12+0.6215*y-11.37*pow(x,0.16)+0.3965*y*pow(x,0.16);
int a=(int)(b+0.5);
return a;
}
int main()
{
double a,b;
scanf("%lf %lf",&a,&b);
printf("%d",chill(a,b));
return 0;
}
图看半天,就下面一行公式有用,麻
10.颜色模型转换
#include<stdio.h>
double max(double x,double y,double z){
return a>=b?(a>=c?a:c):(b>=c?b:c);
}
double min(double x,double y,double z){
return a<=b?(a<=c?a:c):(b<=c?b:c);
}
int main()
{
double R,G,B;
double V,S,H,M,I;
scanf("%lf %lf %lf",&R,&G,&B);
R=R/255;G=G/255;B=B/255;
M=max(R,G,B);
I=min(R,G,B);
V=M;
S=(M-I)/M;
if(M==R){
H=60*(G-B)/(M-I);
}
else if(M==G){
H=60*(2+(B-R)/(M-I));
}
else H=60*(4+(R-G)/(M-I));
if(H<0) H=H+360;
printf("%.4lf,%.4lf%%,%.4lf%%",H,S*100.0,V*100.0);
return 0;
}
11-20循环
11.操作数
#include<stdio.h>
int wei(int x){
int a;
for(a=0;x>0;a++){
x/=10;
}
return a;
}
int he(int x,int y){
int a,t;
for(a=1,t=0;y>0;a*=10,y--){
t+=x/a%10;
}
return t;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;n>0;i++){
n=n-he(n,wei(n));
}
printf("%d",i);
return 0;
}
he是和的拼音()
12.分数的加减乘除法
#include<stdio.h>
#include<math.h>
int gcd(int x,int y){
if(y)
return gcd(y,x%y);
else return x;
}
int main()
{
int a,b,c,d;
scanf("%d/%d %d/%d",&a,&b,&c,&d);
printf("(%d/%d)+(%d/%d)=%d/%d\n",a,b,c,d,(a*d+b*c)/gcd(a*d+b*c,b*d),b*d/gcd(a*d+b*c,b*d));
printf("(%d/%d)-(%d/%d)=%d/%d\n",a,b,c,d,(a*d-b*c)/gcd(a*d-b*c,b*d),b*d/gcd(a*d-b*c,b*d));
printf("(%d/%d)*(%d/%d)=%d/%d\n",a,b,c,d,a*c/gcd(a*c,b*d),b*d/gcd(a*c,b*d));
printf("(%d/%d)/(%d/%d)=%d/%d\n",a,b,c,d,(a*d)/gcd(a*d,b*c),b*c/gcd(a*d,b*c));
return 0;
}
这道题用到了求最大公约数(欧几里得算法)
13.级数和
#include<stdio.h>
double sum(double n)
{
double t,d,s;
for(t=1;t<n;t++)
{if(t+1<10)d=(t+1)/10;
else d=(t+1)/100;
printf("%g+",d+t);
s+=t+d;
}
if (t+1==100)d=0.1,printf("%g",d+t);
else if(t+1<10)d=(t+1)/10,printf("%g",d+t);
else d=(t+1)/100,printf("%g",d+t);
s+=t+d;
return s;
}
int main()
{
double n;
scanf("%lf",&n);
printf("=%g",sum(n));
}
这里我把最后一位分开进行判断是因为我原本在倒数第二行“=%g”前边用了退格符,把多余的一个加号去掉,它报错了我就分开打了。
14.倍数和
#include<stdio.h>
int main()
{
int T,i,sum,d;
scanf("%d",&T);
int A[T];
for(i=0;i<=T-1;i++){
scanf("%d",&A[i]);
}
for(i=0;i<=T-1;i++){
for(sum=0,d=1;d<A[i];d++){
if(d%3==0||d%5==0)sum+=d;
}
printf("%d\n",sum);
}
return 0;
}
这道题一开始完全不会做,是看了去年学长的文章才知道要用数组的。
没有获得授权就不转了。
15.组合数
#include<stdio.h>
int pair(int n)
{
int a,b,c,d,i=0;
for(a=0;a<=9;a++)
for(b=0;b<=9;b++)
for(c=0;c<=9;c++)
for(d=0;d<=9;d++){
if(a+b+c+d==n)i++;
}
printf("%d",i);
}
int main()
{
int n;
scanf("%d",&n);
pair(n);
return 0;
}
16.幂数模
#include<stdio.h>
int main()
{
long long unsigned a,b,c,d=1;
scanf("%llu%llu%llu",&a,&b,&c);
//a=a%c;
while(b!=0){
if(b%2==1)d=(d*a)%c;
b/=2;
a=(a*a)%c;
}
printf("%llu",d);
return 0;
}
用到快速幂以及取模(求余)。
有个同学是在我代码注释部分加上了这个,理论是没错,但是noj报WA,我放去洛谷AC了,怪怪的。
17.比率
#include<stdio.h>
int gcd(int x,int y)
{
if(y)return gcd(y,x%y);
else return x;
}
int main()
{
double a,n=1;
int d;
scanf("%lf",&a);
double t=a;
d=(int)a;
while(d!=t){
n*=10;
t=n*a;
d=(int)t;
}
int b=(int)n;
printf("%d/%d",d/gcd(d,b),b/gcd(d,b));
return 0;
}
补:从大佬那里学到可以用floor()取整,就不用(int)强行取整了
18.乘数模
#include<stdio.h>
int main()
{
long long unsigned a,b,m;
scanf("%llu%llu%llu",&a,&b,&m);
printf("%llu",((a%m)*(b%m)%m));
return 0;
}
在前面做幂数模的时候看了取模的运算法则做这道题就会简单。
19.方阵
#include<stdio.h>
int main()
{
int n,t;
scanf("%d",&n);
for(t=1;t<=n;t++)
{
int p;
for(p=1;p<=n;p++)
{
if(t>=p)printf("%d ",t-p);
else printf("%d ",p-t);
}
printf("\n");
}
return 0;
}
20.对称数
#include<stdio.h>
int wei(int x)
{
int a;
for(a=0;x>0;a++)
{
x/=10;
}
return a;
}
int main()
{
int a,m,count;
scanf("%d",&a);
int n=wei(a);
int A[n];
for(m=1,count=0;count<=n-1;count++,m*=10)
{
A[count]=a/m%10;
}
for(count=0;count<=n-1;count++)
{
if((A[count]==1&&A[n-1-count]==1||A[count]==8&&A[n-1-count]==8||A[count]==0&&A[n-1-count]==0||A[count]==9&&A[n-1-count]==6||A[count]==6||A[n-1-count]==9)==0)
{
printf("No");
break;
}
}
if(count==n)printf("Yes");
return 0;
呃呃,应该是转180吧,转360做什么。
这里我选择用数组把各个位数录进去,然后进行判断。
21-30枚举
21.竖式乘法
#include<stdio.h>
int wei(int n)
{
int i;
if(n==0)return 1;
for(i=0;n>0;i++)
n/=10;
return i;
}
void load(int A[],int a)
{
int i=wei(a),t;
int m;
for(m=1,t=i;i>0;i--){
A[t-i]=a/m%10;
m*=10;
}
}
int main()
{
int n,A[100],b,numtotal;
scanf("%d%d",&b,&n);
numtotal=wei(b*n)+1;
int numn=wei(n),numb=wei(b);
load(A,n);
int t,i,p=0;
for(t=0;t<numn;t++){
A[t]=A[t]*b;
}
for(t=0;numtotal-numb-t>0;t++)printf(" ");
printf("%d\nx",b);
for(t=1;numtotal-numn-t>0;t++)printf(" ");
printf("%d\n",n);
for(t=0;numtotal-t>0;t++)printf("-");
printf("\n");
for(t=0;t<numn;t++){
if(t==numn-1)p++,printf("+");
for(i=0;numtotal-i-t-p-wei(A[t])>0;i++)printf(" ");
printf("%d\n",A[t]);
}
for(t=0;numtotal-t>0;t++)printf("-");
printf("\n %d",b*n);
return 0;
}
裹脚布,麻
不过很多部分是重复的,搞清楚核心其实还好
22.俄罗斯农夫乘法
#include<stdio.h>
int main()
{
int a,b,sum=0;
scanf("%d%d",&a,&b);
if(a==0||b==0);
else if(a==1)sum=a*b;
else {printf("%d %d\n",a,b);
if(a%2==1)sum=b;
while(a!=1){
a/=2;
b*=2;
if(a%2==1)sum+=b;
printf("%d %d\n",a,b);
}
}
printf("%d",sum);
return 0;
}
23.方案数
#include<stdio.h>
int main()
{
int n,cnt,i,j;
scanf("%d",&n);
for(i=1;i<=n;i++){
int t=0;
for(j=i;t<n;j++)
t+=j;
if(t==n)cnt++;
}
printf("%d",cnt);
return 0;
}
这道题我没有从原理出发,推荐看学长们的。
标签:return,noj,int,double,scanf,2024,西北工业大学,printf,include From: https://blog.csdn.net/intern1ty/article/details/142857256