13 条题解
-
2
我们来观察这个等式,
我们很容易即可想到,枚举 ,然后求出,最后判断是否成立然后输出。
但换一种思路,我们能不能枚举 呢?肯定是可以的,下面是证明。
设 为 ;
为 y;
即:
又因为
所以
因此我们只需枚举 ,范围在 到 之间。
这样会比枚举 来得快。
枚举 时间复杂度:,枚举 的时间复杂度:
AC 代码( 5ms ):
#include <cstdio> // scanf , printf #include <cmath> // sqrt , pow using namespace std; int n; bool flag = true; // 标记,判断是否有解 int main(void){ scanf("%d" , &n); for(int x = 10;x < (int)(sqrt(n));x++){ //枚举 x int ab = x * x / 100; int cd = x * x % 100; if(pow(ab + cd , 2) == x * x){ printf("%d\n" , x * x); flag = false; } } if(flag) printf("No\n"); }
打表!
写完后我们发现,这
数据很弱,可以打表耶awa。
经过我大力枚举 后,我总共找到 个符合条件的数 ,我们把它们写入数组里,然后输出小于 的数即可。
时间复杂度:
注意一下输出即可 AC 。
AC 代码( 4ms ):
#include <cstdio> using namespace std; int n , ans[3] = {2025 , 3025}; bool flag = true; int main(void){ scanf("%d" , &n); for(int i = 0;i < 2;i++){ if(ans[i] < n){ flag = false; printf("%d\n" , ans[i]); } } if(flag) printf("No\n"); }
-
2
#include <bits/stdc++.h> using namespace std; int main() { //这题很有意思!有两种方法:直接枚举\先找出数字存档再做 //因为我很懒 ━━( ̄ー ̄*|||━━ 所以我干脆用第一种 (~ ̄▽ ̄)~ //根据(1000 <= n <= 9999),我决定不用考虑优化问题🤭 //你去康一下梯形那题就明白了(累死了) int n,ab,cd; bool f = true;//旗标设置 cin >> n; for(int i = 1000;i <= n;i++)//枚举ABCD { //这个不用说了吧 ab = i / 100; cd = i % 100; if((ab + cd) * (ab + cd) == i) { cout << i << endl; f = false; } } //考虑(烦人的)特殊情况 if(f) cout << "No"; return 0; }
-
1
此题不必大费周章
#include <bits/stdc++.h> using namespace std; int a[4]; int main() { int n; bool flag = false; cin >> n; for (int i = 1000; i <= n; i++) { if (int(pow((i / 1000 * 10 + i / 100 % 10) + (i % 10 + i / 10 % 10 * 10), 2)) == i) { cout << i << endl; flag = true; } } if (!flag) cout << "No"; return 0; }
-
1
#include <iostream>//头文件可以用bits/stdc++.h using namespace std;//这一行没啥好说的 int main()//直接进入主函数 { bool flag=0;//判断是否有输出结果,先赋值为0 int n;//输入 cin>>n;//输入 for(int i=1;i<10;i++)//千位从1开始枚举,不能为0 { for(int j=0;j<10;j++)//百位可以为0 { for(int k=0;k<10;k++)//十位可以为0 { for(int z=0;z<10;z++)//个位可以为0 { if(((i*10+j+k*10+z)*(i*10+j+k*10+z)==i*1000+j*100+k*10+z)&&((i*10+j+k*10+z)*(i*10+j+k*10+z)<n))//判断是否符合要求,且小于n { cout<<i*1000+j*100+k*10+z<<endl;//输出 flag=1;//有了输出结果,不用输出no,赋值为1 } } } } } if(flag!=1)//判断有没有输出结果 { cout<<"No";//如果没有则输出no } return 0;//不要忘记这一行,其实也可以不写 }//已AC,看完请点一个赞吧!谢谢各位大佬!有问题欢迎指出!
-
0
#include <iostream> using namespace std; int n; bool flag=false; bool check(int x) { int AB,CD; CD=x%100; AB=(x-CD)/100; return(AB+CD)*(AB+CD)==x; } int main() { cin>>n; for(int i=1000;i<=n;i++) { if(check(i)) { cout<<i<<endl; flag=true; } } if(!flag) { cout<<"No"<<endl; } return 0; }
为后人服务!!! (已AC,请放心食用)
-
0
依据我的记忆,这不是上课内容吗
L8-5 枚举进阶 - 作业 题目描述:
小核桃发现了一种神奇的数字,这种数字是四位数,用ABCD表示,这个数的特性是(AB+CD)∗(AB+CD)=ABCD,小核桃想知道在比n小的四位数中,有哪些满足条件的数字。 【输入】 输入包括一行,包含一个整数n(1000 <= n <= 9999)。 【输出】 输出包括若干行,每行包含一个整数,按照从小到大的顺序依次输出满足条件的数字。若没有满足条件的数字,就输出No。 【输入样例1】 3000 【输出样例1】 2025 【输入样例2】 2000 【输出样例2】 No
(所以我打算copy一下)- #include <iostream> using namespace std; int main() { int n,m=0; cin>>n; for(int i=1000;i<n;i++) { int ab=i/100; int cd=i-ab100; if((ab+cd)(ab+cd)i) { cout<<i<<endl; m++; } } if (m0) { cout<<"No"; } return 0; }
-
-1
#include <bits/stdc++.h> using namespace std; bool flag = false; int n; void k(int n) { //拆位并判断的函数 int a = n / 1000, b = n / 100 % 10, c = n / 10 % 10, d = n % 10;// 拆位 if ((a * 10 + b + c * 10 + d) * (a * 10 + b + c * 10 + d) == n) { // 判断是不是符合要求 cout << n << endl; //输出 flag = true; //标记为true } } int main() { cin >> n;//输入 for (int i = 1000; i <= n; i++) { k(i);//调用函数 } if (flag == false) { //判断flag是否为false cout << "No"; //如果不是,输出No } return 0; }
-
-2
写题解请注意
鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1335
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 1316
- 已通过
- 409
- 上传者