1. 程式人生 > >演算法實驗題1.2:連續整數和問題

演算法實驗題1.2:連續整數和問題

問題描述:大部分的正整數可以表示為2個以上的連續整數之和。如6=1+2+3,9=5+4=2+3+4。


實驗任務:連續整數和問題要求計算給定的正整數可以表示為多少個2以上連續整數之和。


資料輸入:由檔案input.txt給出輸入資料。第1行有1個正整數。


結果輸出:將計算出的相應的連續整數分解數輸出到檔案output.txt。


輸入檔案示例                          輸出檔案示例

input.txt                                     output.txt

9                                                     2

——題目來源《資料結構(C語言描述)(修訂版)》王曉東編著,演算法實驗1

解題思路:

題目要求的是給定的正整數可以表示為多少個2 個以上連續整數之和。那麼這個連續整數個數無非是偶數和奇數。故只要找出其能表示為偶數和奇數個連續整數和的條件就可以了;
用變數i()表示給定正整數能表示連續整數之和的整數個數; i為奇數根據連續整數和的計算,對於給定的正整數n,有n=(i-1)xxn分解後等號右邊i/2個正整數,那麼只要滿足以下這個式子:i%2!=0&&n%i==0,那麼說明給定整數能表示成i個連續整數之和;
i為偶數那麼對於給定的正整數n,有n=(i-1)x+(
x+i/2)=ix+i/2xn分解後等號右邊[i/2]個正整數
,只要滿足以下這個式子:i%2==0&&n%i==i/2n為給定的整數),那麼說明給定整數能表示成i個連續整數之和;
中間設計數變數t,當滿足條件時t就自動加1,最後輸出t。
#include<iostream>
#include<fstream>
using namespace std;
int main()
    {ifstream infile("input.txt");    
     ofstream outfile("output.txt");
     int i,t=0;
        i=2;
     long int n;
     infile>>n;
     while((i*i)<=(2*n))
    {if((i%2==0)&&(n%i==i/2)) t=t+1;
     if((i%2!==0)&&(n%i==0))==0))    t=t+1;
        i++;
     }
     outfile<<t;
    }