30/09/2018, 18:44

Nhập n in ra tất cả các số từ 1-> n sao cho bình phương của số đó là số "hạnh phúc"

Viết chương trình nhập n in ra tất cả các số từ 1-> n sao cho bình phương của số đó là số “hạnh phúc”.
p/s: định nghĩa số hp của thầy mình dạy là số chia nửa ra sao cho tổng nửa bên này = tổng nửa kia.

VD: 13522. (1+3=2+2) 5 không tính -_- (thầy mình kêu đây cũng là số hp mới khó hiểu chứ)
4581 (4+5=8+1)

(
khó quá các bác ơi T.T.
em mới học đến mảng vs mấy vòng lặp thôi)

17XGOD viết 20:54 ngày 30/09/2018

số 13-5-22 mỗi bên một nữa đúng rồi còn gì =))

Nguyễn Hoàng Trung viết 20:55 ngày 30/09/2018

Anh giải thích giùm em code với @@ nhìn vô em chả hiểu gì

17XGOD viết 20:59 ngày 30/09/2018

từ em ơi =)) test lại thì anh thấy đang có vấn đề ,nhập n <= 100 thì in ra đúng nhưng lên nữa thì …

17XGOD viết 20:57 ngày 30/09/2018
#include <conio.h>
#include <stdio.h>
main(){
	printf("Liet ke so hanh phuc\n");
	int n,i1,i2,dem,s1,s2,dem1,dem2;
	do{
		printf("Nhap so >0: ");
		scanf("%d",&n);
	}while (n<=0);
		for (int i=10;i<=n;i++){
			i1=i*i;
			i2=i1;
			s1=0; s2=0;
			dem=0;
			while (i1>0){
				i1=i1/10;
				dem++;
			}
			if (dem%2==0){
				dem1=dem/2;
				while (dem>dem1){
					s1+= i2%10;
					i2=i2/10;
					dem--;
				}
				while (dem>0){
					s2+=i2%10;
					i2=i2/10;
					dem--;
				}
			}
			else if (dem%2!=0){
				dem2=(dem/2)+1;
				while (dem>dem2){
					s1+= i2%10;
					i2=i2/10;
					dem--;
				}
				dem--;
				i2/=10;
				while (dem>0){
					s2+=i2%10;
					i2=i2/10;
					dem--;
				}
			}
			if (s1==s2) printf("%d ",i);
		}
	getch();
}

Đây em đã chỉnh sửa lại thuật toán lần này đảm bảo đúng 100% nãy giờ ngồi test tay muốn tắt cả thở :sure:

Bạn test xem thử thế nào mình không biết các số từ 0 đến 10 có phải là số hạnh phúc không nên mình cho chạy từ i=10 đến n mình nhập n=13 thì nó in ra 11( 11^2 = 121 ) là số hạnh phúc bạn có bộ số để test thì test hộ mình

17XGOD viết 20:54 ngày 30/09/2018

@hoangtrung1999 Như này nhé

  • Đầu tiên em cho nhập giới hạn n>0

  • Rồi em cho chạy vòng lặp i=10;i<=n;i++

  • với mỗi i thì em sẽ phải tính i^2 i1=i*i

  •   			i1=i1/10;
      			dem++;
    

để xem thử là sối*i đó có bao nhiêu chữ số(chẵn, lẽ), với mỗi TH sẽ có cách xử lí khác nhau .TH: Chẵn:dem1=dem/2;
while (dem>dem1){
s1+= i2%10;
i2=i2/10;
dem–;
}
while (dem>0){
s2+=i2%10;
i2=i2/10;
dem–;
}
cái chỗ này em copy code về chạy debug với 1 con số nhỏ thôi thì sẽ hiểu ngay, đối vớiTH lẻ``` thì tương tự

  • cuối cùng là so sánh 2 cái tổng, nếu thoả đk thì in i ra ngoài
Tùng Nguyễn viết 20:57 ngày 30/09/2018

thanks kiu bác :">. em nghĩ hoài k ra cái thuật toán :(. để em nghĩ xem có cách nào gọn hơn nữa k.hehehe

bphvcg viết 20:50 ngày 30/09/2018

Các bác coi code em sai chỗ nào với toàn in ra là số k hạnh phúc

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define N 1000

void SoHanhPhuc(int n);

int main(void)
{
	int n,binhphuong;
	scanf("%d",&n);
	binhphuong=n*n;
	SoHanhPhuc(binhphuong);
	return 0;
}

void SoHanhPhuc(int n)
{
	int i, sodu, chu=0;
	int temp;
	int dem[N];
	while (n>0)
	{
		sodu=n%10;
		temp=sodu;
		dem[chu]=temp;
		printf("%d\n",dem[chu]);
		chu=chu+1;
		n=n/10;
	}
	int Tong1=0, Tong2=0;
	if (chu%2==0)
	{
		for (i=0; i<chu/2; i++)
		{
			Tong1 = Tong1 +dem[i];
		}
		for (i=chu/2 ; i< chu; i++)
		{
			Tong2 = Tong2 + dem[i];
		}
		if (Tong1 == Tong2) 
		{
			printf("So hanh phuc\n");
		}
		else printf("So khong hanh phuc\n");
	}
	else if ( chu%2!=0)
	{
		for (i=0; i< chu/2; i++)
		{
			Tong1 = Tong1 + dem[i];
		}
		for (i = (chu/2) + 1; i< chu; i++)
		{
			Tong2 = Tong2 + dem[i];
		}
		if (Tong1 == Tong2 && Tong1 == dem[chu/2] && Tong2 == dem[chu/2] )
			printf("So hanh phuc\n");
		else 
			printf("So khong hanh phuc\n");
	}
	return;
}
bphvcg viết 20:51 ngày 30/09/2018

à code chạy rồi do mình nhập vào k phải số hạnh phúc nên nó k hạnh phúc cảm ơn thớt bài tập rất hay

17XGOD viết 20:59 ngày 30/09/2018

Bác dùng mảng à để em tham khảo với

Tùng Nguyễn viết 20:57 ngày 30/09/2018

#include<stdio.h>
#include<conio.h>

int sosanh(int n)
{
int m=n, count=0,count2=0,s1=0,s2=0;

while(n>0){
	n/=10;
	count++;
}

	while(count2<count/2){
		 s1+=m%10;
		 count2++;
		 m /= 10;
	}
	if (count%2==1)	{
		m /= 10;
	}		
	while(m>0){
		s2+=m%10;
		m = m/10;	
	}
	if(s1==s2) return 1;
	else return 0;

}

main(){
int n, i;
printf(“nhap n = “);
scanf(”%d”,&n);
for(i=1;i<=n;i++)

if(sosanh(i*i)==1&&i>=10)
printf("%d\n",i);

   }

code này ngắn hơn chưa bác

17XGOD viết 20:53 ngày 30/09/2018

Bác test thử xem có đúng không

Bài liên quan
0