鱼C论坛

 找回密码
 立即注册
查看: 2849|回复: 9

[已解决]连续自然数和(用了俺三分之一的鱼币。)

[复制链接]
发表于 2019-8-16 22:25:32 | 显示全部楼层 |阅读模式
9鱼币
这是我学校上的一道编程题

下面是我的代码
  1. #include<stdio.h>
  2. #include<math.h>
  3. void createRealDivisors(int n){
  4.     int nRoot= (int)sqrt(2*n),a[nRoot],i,count = -1;
  5.     for( i = 2; i <= nRoot;i++){
  6.         if(!(2*n%i)){
  7.             printOutcome(i,2*n/i);
  8.             a[++count] = i;
  9.         }
  10.     }
  11.     if (!(2*n - a[count] * a[count]))
  12.         count--;
  13.     for(i = count;i >= 0;i--)
  14.         printOutcome(2*n / a[i],a[i]);
  15. }

  16. void printOutcome(int a,int b){

  17.     if(a%2 ^ b%2 && a+1-b >= 0){
  18.         int left = (a+1-b) / 2;
  19.         int right = left + b - 1;
  20.         printf("%d %d\n",left,right);
  21.     }
  22. }


  23. int main(){
  24.     int n;
  25.     scanf("%d",&n);
  26.     createRealDivisors(n);
  27.     return 0;
  28. }
复制代码


我是用等差算出中差 再用个数算出第一项和最后一项
以为对了 但是提交上去还是错了

错了就改 关键是学校网不给看错在哪  俺很难受

我陷入我的思维很难找到我错的地方  
大佬们,求助啊
最佳答案
2019-8-16 22:25:33
#include<bits/stdc++.h>
using namespace std;
int m;
int main(){
    cin>>m;
    for(int k1=sqrt(2*m);k1>1;k1--)//枚举k1(注意是k1>1而不是k1>=1)
        if(2*m%k1==0 && (k1+2*m/k1)%2){//如果K2是整数而且与K1一奇一偶
            int k2=2*m/k1;
                cout<<(k2-k1+1)/2<<" "<<(k1+k2-1)/2<<endl;//输出答案
        }
    return 0;
}
1.png

最佳答案

查看完整内容

#include using namespace std; int m; int main(){ cin>>m; for(int k1=sqrt(2*m);k1>1;k1--)//枚举k1(注意是k1>1而不是k1>=1) if(2*m%k1==0 && (k1+2*m/k1)%2){//如果K2是整数而且与K1一奇一偶 int k2=2*m/k1; cout
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-16 22:25:33 | 显示全部楼层    本楼为最佳答案   
#include<bits/stdc++.h>
using namespace std;
int m;
int main(){
    cin>>m;
    for(int k1=sqrt(2*m);k1>1;k1--)//枚举k1(注意是k1>1而不是k1>=1)
        if(2*m%k1==0 && (k1+2*m/k1)%2){//如果K2是整数而且与K1一奇一偶
            int k2=2*m/k1;
                cout<<(k2-k1+1)/2<<" "<<(k1+k2-1)/2<<endl;//输出答案
        }
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-16 23:11:42 | 显示全部楼层
换个方法实现试试,比如暴力法。可能它不赞同你的方法。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-16 23:32:25 | 显示全部楼层
本帖最后由 迷雾少年 于 2019-8-16 23:38 编辑

思路:滑动窗口
  1. #include <iostream>
  2. #include <vector>
  3. #include <cctype>
  4. /*使用迭代器将输入的数字翻倍输出*/
  5. using namespace std;
  6. int main(int argc, char const* argv[])
  7. {
  8.         int lf = 0, rg = 1,sum=lf+rg;
  9.         int M = 10000;//2+3+4
  10.         while (lf<rg && lf<=1000000000)
  11.         {
  12.                 if (sum < M) {
  13.                         rg++;
  14.                         sum += rg;
  15.                 }
  16.                 else if(sum == M)
  17.                 {
  18.                         cout << "lf:" << lf << " " << "rg:" << rg << endl;
  19.                         sum -= lf;
  20.                         lf++;
  21.                 }
  22.                 else
  23.                 {
  24.                         sum -= rg;
  25.                         rg--;
  26.                        
  27.                        
  28.                         sum -= lf;
  29.                         lf++;
  30.                        
  31.                 }
  32.         }

  33.        
  34.         return 0;
  35. }
复制代码


输入输出

  1. lf:18 rg:142
  2. lf:297 rg:328
  3. lf:388 rg:412
  4. lf:1998 rg:2002
  5. 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-16 23:36:11 | 显示全部楼层
ba21 发表于 2019-8-16 23:11
换个方法实现试试,比如暴力法。可能它不赞同你的方法。。

n的值为1000000000
亲,暴力是会掉头发的
我有在网上找个暴力的跟我程序的答案对比下 我所输的n对应的值都一样
我思路是对的
我想要知道我程序错在哪
是遗漏了什么值 还是逻辑上的错误 还是定义内存太大溢出
如果了解编译机制就好多了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-16 23:41:23 | 显示全部楼层
ba21 发表于 2019-8-16 23:11
换个方法实现试试,比如暴力法。可能它不赞同你的方法。。

看到这个M的级数暴力(O^2)就不可能了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-16 23:47:39 | 显示全部楼层
迷雾少年 发表于 2019-8-16 23:41
看到这个M的级数暴力(O^2)就不可能了

我们学校c超过一秒就不行了
单循环也不行的

俺不是要解决这道题才发这道贴的。。。
不过谢谢你们
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-18 10:18:09 | 显示全部楼层
这个方法行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-18 10:19:32 | 显示全部楼层
或者这个
#include<cstdio>

int m;

int main()
{
    scanf("%d",&m);
    int sum=3;
    for(int i=1,j=2;i<=m/2;)
    {
        if(sum==m)
        {
            printf("%d %d\n",i,j);
            sum-=i;
            i++;
        }
        else if(sum<m)
        {
            j++;
            sum+=j;
        }
        else
        {
            sum-=i;
            i++;
        }
    }
    return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-18 13:44:05 | 显示全部楼层
zykt 发表于 2019-8-18 10:17
#include
using namespace std;
int m;

看了你的程序我知道错哪了


假如m 是 10

结果你输出1 4
我是 0 4  
       1 4
题目说是说自然数

而且因为每一项都是大于1 的递增序列 所以项数不可能超过m的一半

  1. #include<stdio.h>
  2. #include<math.h>
  3. void createRealDivisors(int n) {
  4.         int nRoot= (int)sqrt(2*n),i;
  5.         for( i = nRoot; i >= 2; i--)
  6.                 if(!(2*n%i))   //求因子
  7.                         printOutcome(2*n/i,i); //判断,输出
  8. }
  9. void printOutcome(int a,int b) {
  10.         if(a%2 ^ b%2 && a+1-b > 0) { //判断奇偶我用了异或,
  11.                 int left = (a+1-b) / 2;//中差除以2,距离除以2 ,我把它们先加起来在除以二避免类型转换
  12.                 int right = left + b - 1;
  13.                 printf("%d %d\n",left,right);
  14.         }
  15. }


  16. int main() {
  17.         int n;
  18.         scanf("%d",&n);
  19.         createRealDivisors(n);
  20.         return 0;
  21. }
复制代码

刚刚拿你的程序先过
然后我改了我的也过了

谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-15 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表