ハービン科学技術大学コンピューター20-7、8プログラミングの基本実践1
Problem_A_共通の倍数を判断する
説明
正の整数を入力し、それが2と3の共通の倍数であるかどうかを判断します。はいの場合は「はい」を出力し、そうでない場合は「いいえ」を出力します
。——————————————
入力
正の整数を入力します
—————— ————————
出力
はいまたはいいえ
——————————————
サンプル入力
6
5
——————————————
サンプル出力
はい
いいえ
思考の分析:この
質問は、質問の意味に直接応じることができます。数値を入力すると、2と3の残りをとった後、ゼロかどうかを判断できます。両方がゼロの場合は「はい」を出力し、そうでない場合は「いいえ」を出力します。
#include<cstdio>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n%3==0 && n%2==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
Problem_B_には3の整数が含まれています
説明
2つの正の整数aとb(a <b)が与えられた場合、aとbの間の3つの数値すべての合計を計算します。例:2 15. 3を含む数値は3と13であるため、このデータグループの合計は16です。
——————————————
入力
2つの正の整数
———————————————
出力
条件を満たすデータの合計
—————————— ————
サンプル入力
2 15
10 24
——————————————
サンプル出力
16
36
アイデアの分析:
特定の間隔ですべての数値を列挙し、各数値のすべての桁を1回判断するだけで済みます。数値が特定の桁で3と表示される場合は、この数値をansに追加するだけで済みます。内部では
、最終的にansの値を出力できます
#include<cstdio>
using namespace std;
bool check(int x)
{
int temp;
while(x)
{
temp=x%10;
if(temp==3) return true;
x/=10;
}
return false;
}
int main()
{
int l,r;
while(~scanf("%d%d",&l,&r))
{
int ans=0;
for(int i=l;i<=r;i++)
if(check(i))
ans+=i;
printf("%d\n",ans);
}
}
Problem_C_Commondivisorとcommonmultiple
説明
2つの正の整数と最大共通除数の最小共通倍数
--------------
入力
入力2つの整数
--------------
出力
出力除数共通の倍数の合計
——————————————
サンプル入力
2 3
21 9
——————————————
サンプル出力
1
6
3
63
思考の分析:
この質問の難しさは、2つのgcd(最も一般的でない要因、
知らないBaidu)を見つけることです。gcdを計算した後、最も一般的でない倍数がa * b / gcdである
ことを簡単に証明できるので、このコードがあります。
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int gcd(int a,int b)
{
if(a%b==0)
return b;
return gcd(b,a%b);
}
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int Gcd=gcd(max(a,b),min(a,b));
printf("%d\n%d\n",Gcd,a*b/Gcd);
}
}
Problem_D_1年のどの日を決定する
説明
特定の日、特定の月、および特定の日を入力して、その年の日を決定しますか?
——————————————
入力
入力日付
——————————————
出力
出力は1年の日です
———————— ——————
サンプル入力
2010 1 6
2012 3 2
——————————————
サンプル出力
6
62
思考分析:
これも水問題です。まず
、2月の日数に直接影響するため、飛躍年が最初に判断されることを明確にする必要があります。2月の日数を知った後、今月より前のサイクルを使用する必要があります。その月の日数を合計し(これが完了する前の各月を意味する必要があります)、次にその月の日数を追加して最終的な回答を取得します
#include<cstdio>
using namespace std;
int mon[15]={
0,31,0,31,30,31,30,31,31,30,31,30,31};
bool isr(int Y)
{
if((Y%4==0 && Y%100!=0) || Y%400==0)
return true;
else return false;
}
int main()
{
int y,m,d;
while(~scanf("%d%d%d",&y,&m,&d))
{
int cnt=0;
if(isr(y)) mon[2]=29;
else mon[2]=28;
for(int i=1;i<m;i++)
cnt+=mon[i];
cnt+=d;
printf("%d\n",cnt);
}
return 0;
}
Problem_E_三角形の面積の計算
説明
は、三角形の3つの辺を示し、その面積を計算します
————————————
入力
三角形の3つの辺の長さ(単一精度)
——————————————
出力
三角形の面積(小数点以下2桁)
——————————————
サンプル入力
3 4 5
2 6 6
3.5 7.83 6.178
——————————————
サンプル出力
6.00
5.92
10.46
思考分析:
三角形の3辺の長さがあるため、この質問はさらに水っぽくなります。したがって、答えは直接ヘレンの公式です(小数点以下3桁が保持されることに注意してください)。
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
double a,b,c,p;
while(~scanf("%lf%lf%lf",&a,&b,&c))
{
p=(a+b+c)/2;
printf("%.2f\n",sqrt(p*(p-a)*(p-b)*(p-c)));
}
return 0;
}