질문은 : 8 자리 숫자의 티켓 스트립이 있습니다. 첫번째 티켓은 M 번, 마지막 N 번입니다. 크기 M과 N은 다음 관계를 충족시킵니다 : 10000000 ≤ M < N ≤ 99999999. 주어진 숫자 사이의 "운이 좋은"티켓의 수를 결정해야합니다. 첫 번째 네 자리의 합계가 마지막 네 자리의 합계와 같으면 티켓은 "행운"이라고 간주됩니다.시간 제한을 제거하기 위해 내 코드를 어떻게 다르게 할 수 있습니까?
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int calcSumDigits(int n)
{
int sum=0;
while (n!=0)
{
sum+=n%10;
n/=10;
}
return sum;
}
int main(void)
{
int a,b,cnt=0,x,y;
cin>>a>>b;
for (int i=a;i<=b;i++)
{
x=i%10000;
y=(i-x)/10000;
if (calcSumDigits(x)==calcSumDigits(y)) cnt++;
}
cout<<cnt;
return 0;
}
결과를 잘 작성하지만이 결과를 제공하기 위해 프로그램에서 조금 시간이 오래 걸립니다 : 그리고 여기 내 코드입니다. 예를 들어 10000000에서 99999999까지 시도하면 4379055가 표시되지만 6 초 이상 걸린다
여기에 몇 가지 트릭이 있습니다. 그들 중 하나에 대해 "메모"를 찾는다. – Ashalynd
최적화를 사용하여 컴파일을 시도하십시오. – sp2danny
비트 마스킹 및 메모를 참조하십시오. 그것의 동적 프로그래밍 문제. – Tahlil