Cách giải phương trình nghiệm nguyên

Đề bài: tìm x nhỏ nhất thỏa mãn x+S(x)*x-N=0 với 1<N<10^19 và S(x) là tổng chữ số của x.
Code dưới đã giải quyết vấn đề có 2 thắc mắc là:

  1. Có phương thức giải quyết nào đone giản hơn ko
  2. Có yêu cầu nếu ko tìm dc x thỏa mãn in ra -1 e chưa giải quyết dc

Xin mn thảo luận

#include<stdio.h>
#include<math.h>
int main(){
	long N,x,Sx,S;
	printf("Nhap so N:");scanf("%ld",&N);
	for(long x=1;x<N;x++){
		if(N%x==0){
			Sx=N/x-1;
			S=0;long x1=x;
			while(x1!=0){
			long x2=x1%10;
			S+=x2;
			x1/=10;}
		if(S==Sx) printf("So nho nhat thoa man la %ld",x);	
		}}
		}

Phần -1 thì bạn tìm hiểu Digital Root.

4 Likes

Bài này duyệt trên S(x) thay vì x :slight_smile: vì S(x) không thể lớn hơn 151.

Viết lại sẽ thành (S(x) + 1)\times x = N

5 Likes
  • Cách của bạn là đơn giản và dễ hiểu nhất rồi.
    ý bạn là có cách nào tối ưu hơn không?
  • Sau khi tìm được x nhỏ nhất thì in ra x và return. Cuối hàm bạn mặc định in ra -1 là thỏa mãn yêu cầu thứ 2 rồi.
loop(1->N){
    ...
    if(S==Sx){
        printf("So nho nhat thoa man la %ld",x);
        return 0;
    }
}
printf("-1");
6 Likes

Cảm ơn bác rất nhiều!

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?