1~10
10.颜色转换
#include <stdio.h>
double Max(double a,double b,double c){
double max;
max=(a>b)?a:b;
max=(c>max)?c:max;
return max;
}
double Min(double a,double b,double c){
double min;
min=(a<b)?a:b;
min=(c<min)?c:min;
return min;
}
int main()
{
double R,G,B;
double H,S,V;
scanf("%lf%lf%lf",&R,&G,&B);
R/=255,G/=255,B/=255;//很屑的单位转换
V=Max(R,G,B);
double min=Min(R,G,B);
if(V==0)S=0;//分母不为0
else S=(V-min)/V;
double diff=V-min;//额外diff注意设成浮点类型,想象一下如果是int是否会进入循环
//假设此时V,min都小于1
if (V!= min) {
if (V == R) {
H = 60 * ((G - B)/diff);
} else if (V == G) {
H = 60 * (2 + (B - R)/diff);
} else if (V == B) {
H = 60 * (4 + (R - G)/diff);
}
if (H < 0) {
H += 360;
}
}else H=0;
printf("%.4lf,%.4lf%%,%.4lf%%\n", H, S*100, V*100);//注意加了百分号%%
return 0;
}
11~20
11.分数的加减乘除
#include<stdio.h>
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int main()
{
int u1,u2;
int d1,d2;
scanf("%d/%d %d/%d",&u1,&d1,&u2,&d2);
int D=gcd(d1,d2);
int d11=d1/D;
int d21=d2/D;
D=(d1/D)*(d2/D)*D;
int u=u1*d21+u2*d11;
int res1=gcd(u,D);
printf("(%d/%d)+(%d/%d)=%d/%d\n",u1,d1,u2,d2,u/res1,D/res1);
int U=u1*d21-u2*d11;
int res2=gcd(U,D);
printf("(%d/%d)-(%d/%d)=%d/%d\n",u1,d1,u2,d2,U/res2,D/res2);
int d12=d1*d2;
int u12=u1*u2;
int la=gcd(d12,u12);
printf("(%d/%d)*(%d/%d)=%d/%d\n",u1,d1,u2,d2,u12/la,d12/la);
int d22=d1*u2;
int u22=u1*d2;
int si=gcd(d22,u22);
printf("(%d/%d)/(%d/%d)=%d/%d\n",u1,d1,u2,d2,u22/si,d22/si);
}
但是目前有两个问题:
1.如果作差出现0的话,辗转相除法用不了,运行会报错
2.也是辗转相除,引入负的公约数,'-'会出现在分母(
但是既然它给的数据是科学合理的,以上
12.幂数模
#include<stdio.h>
int main()
{
unsigned long long a,b,m;//注意到2^63
unsigned long long s=1;
scanf("%llu%llu%llu",&a,&b,&m);
//a%=m;(这是笔者第一次的答案,这次取模很有可能导致s=0)
while(b){
if(b&1){
s*=a;
s%=m;//防止数据爆炸,乘完就取模
}
a*=a;
a%=m;
b>>=1;//同上
}
s%=m;//最后一道防线
printf("%llu\n",s);
return 0;
}
13.对称数
#include<stdio.h>
#include<string.h>
int main()
{
char a[50]="\0";//记得初始化
scanf("%s",a);//a就是它的地址了
int j=strlen(a);
int point=0;//便于判断是否出现非对称的数字
for(int i=0;i<=j;i++){
a[i]-='0';
if(a[i]==2||a[i]==3||a[i]==4||a[i]==5||a[i]==7){
printf("No\n");
point=1;
break;
}
}
if(point==0)
printf("Yes\n");
return 0;
}
[点击并拖拽以移动]
15.倍数和
#include<stdio.h>
#include<stdlib.h>//后面要用到malloc
int main()
{
int *a,l;//10^9所以就用int了,不浪费哈
scanf("%d",&l);
a=(int *) malloc (sizeof(int)*l);
for(int i=0;i<l;i++)
scanf("%d",&a[i]);//如果写成scanf("%d\n")反而读不进来,\n会被认为是空格
for(int i=0;i<l;i++){
int sum=0;//每次一个新的n都要初始化哦
for(int k=3;k<a[i];k++){//也可以从1或者2开始,没必要
if(k%3==0||k%5==0)
sum+=k;
}
printf("%d\n",sum);
}
return 0;
}
16.方阵
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int **a=(int **)malloc(sizeof(int*)*n);//行,每一行,都是一个数组
for(int i=0;i<n;i++)
a[i]=(int *)malloc(sizeof(int)*n);//列
for(int i=0;i<n;i++){
a[i][i]=0;
for(int k=i+1;k<n;k++)
a[i][k]=k-i;//横着看,每一位上的数字可以理解为,该点与a[i][i]的距离
for(int j=i-1;j>=0;j--)
a[i][j]=i-j;
}
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
printf("%d",a[i][k]);
if(k<n-1)
printf(" ");
else printf("\n");//注意格式
}
}
return 0;
}