西工大2024noj部分题解(讨论版

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

.快速幂算法1

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值