A题:
思路:暴力一下就行,用long long,不然有可能会溢出,最好用C++,Java有时候正确,有时候编译错误
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;
int main()
{
ll a,b,n;
while (scanf("%I64d%I64d%I64d",&a,&b,&n) != EOF) {
int index = 0;
ll min1 = LONG_LONG_MAX;
for (int i=1; i<=n; i++) {
if (n % i == 0) {
ll sum = n / i * a + b * n * i;
if (sum < min1) {
min1 = sum;
index = i;
}
}
}
printf("%d\n",index);
}
return 0;
}
D题:
思路:标称上是打表,我是用一个数组进行标记的,只要以前出现过这个数就退出,不然肯定会陷入死循环
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;
int getSum(int n)
{
int sum = 0;
while (n != 0) {
int temp = n % 10;
sum += temp * temp;
n /= 10;
}
return sum;
}
int main()
{
int n;
int a[10000];
while(scanf("%d",&n) != EOF)
{
int sum = n;
memset(a,0,sizeof(a));
bool flag = false;
while (true) {
sum = getSum(sum);
if (sum == 1) {
flag = true;
break;
}
if (a[sum] > 0)
break;
a[sum] = 1;
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}