計科190405程式設計題解

Hevttc_Cao發表於2020-11-07

一、三角形

  • 判斷是否是三角形:任意兩邊之和大於第三邊
  • 注意三角形的邊不一定是整型
#include <stdio.h>
int main () {
	int n;
	scanf("%d",&n);
	while(n -- ) {
		double a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		if (a+b>c&&a+c>b&&b+c>a) puts("YES");
		else puts("NO");
	}
	return 0;
}

二、翻硬幣

  • 答案就是總硬幣個數減去a的倍數和b的倍數的個數,但是a和b的公倍數會被翻兩次,相當於沒翻,所以還要加上a和b的最小公倍數的個數*2,乘以2是因為減去a和b的倍數,相當於減了兩次公倍數。

  • a和b的最小公倍數其實就是a*b/(他們的最大公因數)

//求最大公因數程式碼
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
#include <stdio.h>
int gcd(int a,int b) {
	return b?gcd(b,a%b):a;
}

int main () {
	    int t;
	    scanf("%d",&t);
	    while(t -- ) {
	    	
		int n,a,b;
		scanf("%d%d%d",&n,&a,&b);
		int k = a*b/gcd(a,b);
		printf("%d\n",n-n/a-n/b+n/k+n/k;
	}
	return 0;
}

二進位制統計

  • 思路:反覆%2,除2,直到%2=1,說明末尾沒0了,將統計的0的個數放到另一個陣列中
#include <stdio.h>
int cnt[32]; //cnt[i]表示末尾有i個0的個數為cnt[i]

void divide(int k) 
{
    int count = 0;
    while(k%2==0)
    {
        k/=2;
        count++;
    }
    cnt[count]++;
}

int main () {
    int n;
    scanf("%d",&n);
    
    for (int i = 1; i <= n; i ++)
    {
        int k;
        scanf("%d",&k);
        divide(k);
    }
    
    for (int i = 0; i < 32; i ++) printf("%d ",cnt[i]);
    return 0;
}

相關文章