连续因子原题网址:
https://pintia.cn/problem-sets/994805046380707840/problems/994805138600869888
#include <string.h>
#include <stdio.h>
#include <math.h>
#include<iostream>
using namespace std;
bool is_prime(int n)
{
int i;
for (i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int i, j, n, a = 0, b = 0;
cin >> n;
if (is_prime(n) == true)
{
cout << "1\n" << n << endl;
return 0;
}
for (i = 2; i < sqrt(n) + 1; i++)
{
if (n % i == 0)
{
int sum = i;
for (j = i + 1; j < sqrt(n) + 1; j++)
{
sum *= j;
if (n % sum != 0)
{
break;
}
}
if (a < j - i)
{
a = j - i;
b = i;
}
}
}
cout << a << endl;
for (i = b; i <= a + b - 1; i++)
{
if (i != b)
{
cout << "*";
}
cout << i;
}
printf("\n");
return 0;
}
思路:
先判断是否为质数,若是质数输出固定内容,若不是就进行后续操作。记录每一个能被整除的数字,并且判断接下来连续的几个数字的乘积(这个很重要)是否能被整除。每次找到最长的因子串,最后输出答案。
易错点:
1.不要每次都变化输入的n值,如果要变,一定要将n给一个变量再对这个变量进行操作。(最好不要修改n值)
2.注意的是,需要判断的是连续几个数字的乘积是否为n的某个因子,而不是连续的几个数字单独的是否为某个数的因子。
3.需要及时的修改中间答案和开始的赋初值操作。
整除光棍原题网址:
错误示例:
#include
using namespace std;
int p[1005], t[1005], m[1005];
bool pd() {
bool lsp = true;
for (int i = 1004; i >= 0; i--) {
if (lsp == true && p[i] != 0) {
lsp = false;
}
if (lsp == false) {
if (p[i] != 1) {
return false;
}
}
}
return true;
}
int main() {
int x, n = 0;
cin >> x;
for (int i = 0; i < 1005; i++) {
p[i] = x % 10;
x /= 10;
m[i] = p[i];
if (x == 0) {
n = i + 1;
break;
}
//m[i] = p[i];
}
while (pd()==false) {
int temp, k;
temp = k = 0;
for (int i = 0; i < n; i++) {
temp = p[i] + m[i] + k;
p[i] = temp % 10;
k = temp / 10;
}
if (k != 0) {
p[n] = k;
n++;
}
t[0]++;
int w = 0;
while (t[w] >= 10) {
t[w + 1]++;
t[w] -= 10;
w++;
}
}
bool kpl = true;
t[0]++;
int w = 0;
while (t[w] >= 10) {
t[w + 1]++;
t[w] -= 10;
w++;
}
for (int w = 1004; w >= 0; w--) {
if (kpl == true && t[w] != 0) {
kpl = false;
}
if (kpl == false) {
cout << t[w];
}
}
cout << " " << n;
return 0;
}
导致错误原因:这份代码就是单纯的模拟计算过程,导致运行速度很慢,得不到全部的分数。需要进行优化,或者重构代码。
正确示例:
#include<iostream>
using namespace std;
int main() {
int x;
cin >> x;
int s = 0, n = 0;
while (s < x) {
s = s * 10 + 1;
n++;
}
while (1) {
cout << s / x;
s = s % x;
if (s % x == 0) {
break;
}
s = s * 10 + 1;
n++;
}
cout << " " << n;
return 0;
}
思路:直接输出商,不进行数组存储商的操作。
商运算技巧:
while (1) {
cout << s / x;
s = s % x;
if (s % x == 0) {
break;
}
s = s * 10 + 1;
n++;
}